http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57254

            Bug ID: 57254
           Summary: Overload resolution failure when member function
                    tempate is defined out-of-line
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lucdanton at free dot fr

Using 4.9.0 20130509 (experimental) [trunk revision 198734] and -std=c++11 the
following is rejected:

//---
struct foo {
    template<typename T>
    void bar(T) &;

    template<typename T>
    void bar(T) &&;
};

template<typename T>
void foo::bar(T) & {}

template<typename T>
void foo::bar(T) && {}

int main()
{
    foo f;
    // error: call of overloaded 'bar(int)' is ambiguous
    f.bar(0);
}
//---

Output is:

main.cpp: In function 'int main()':
main.cpp:19:12: error: call of overloaded 'bar(int)' is ambiguous
     f.bar(0);
            ^
main.cpp:19:12: note: candidates are:
main.cpp:10:6: note: void foo::bar(T) [with T = int]
 void foo::bar(T) & {}
      ^
main.cpp:13:6: note: void foo::bar(T) [with T = int]
 void foo::bar(T) && {}
      ^

If on the other hand the members are defined inline, the code is accepted.
Similarly if bar is made a set of non-template functions and e.g. T is an alias
for int.

Reply via email to