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

           Summary: template function overload incorrectly ambiguous
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: timothyjgi...@gmail.com


Created attachment 24685
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24685
gcc -v -save-temps main.cpp [[stderr]]

The following code works fine with gcc 4.4.3 20100127 (and I'm pretty sure it
worked with 4.6.0 before I updated gcc-c++ yesterday); so maybe this is a
regression from a relatively recent change.

Here's the minimal test case:


struct S { typedef int iterator; };
template <typename T, typename U> void F( typename T::iterator, U   ) {}
template <typename T>             void F( typename T::iterator, int ) {}
int main()
{
  S::iterator i(42);
  F<S>(i,1); // FAILS=4.6.0 20110530 ; OK=4.4.3 20100127
  return 0;
}


g++ without any other options produces the following (incorrect) error:

main.cpp: In function ‘int main()’:
main.cpp:7:11: error: call of overloaded ‘F(S::iterator&, int)’ is ambiguous
main.cpp:7:11: note: candidates are:
main.cpp:2:40: note: void F(typename T::iterator, U) [with T = S, U = int,
typename T::iterator = int]
main.cpp:3:28: note: void F(typename T::iterator, int) [with T = S, typename
T::iterator = int]

Earlier version of g++ did not produce this error.

Note that if I change the definition of F to void F(T,U) and void F(T,int) and
pass in S::iterator as the template argument, then it compiles without error.  
So, it's somehow having a problem with the typename with deduction.

I'd be appreciative if someone simply confirmed if this is a bug or not.
I have a lot of code that fails now that didn't fail a few days ago, and I'm
now wondering if I need to change my code or change back to an older compiler
until this gets resolved.

Reply via email to