http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59818
Bug ID: 59818 Summary: [4.9 regression] Bogus error: call of overloaded .... is ambiguous Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ppluzhnikov at google dot com This is caused by r197790 (fix for PR c++/23055). Google ref: b/12471166 /// --- cut --- template <class T> struct Identity { typedef T type; }; struct Foo { template <typename T> Foo(T*, void (Identity<T>::type::*m)(void)); template <typename T> Foo(const T*, void (Identity<T>::type::*m)(void) const); }; struct Bar { void Method(void) const; }; void Bar::Method(void) const { Foo foo(this, &Bar::Method); } /// --- cut --- Using g++ (GCC) 4.9.0 20140110 (experimental) g++ -c t.cc t.cc: In member function 'void Bar::Method() const': t.cc:20:29: error: call of overloaded 'Foo(const Bar*, void (Bar::*)() const)' is ambiguous Foo foo(this, &Bar::Method); ^ t.cc:20:29: note: candidates are: t.cc:11:3: note: Foo::Foo(const T*, void (Identity<T>::type::*)() const) [with T = Bar; typename Identity<T>::type = Bar] Foo(const T*, void (Identity<T>::type::*m)(void) const); ^ t.cc:8:3: note: Foo::Foo(T*, void (Identity<T>::type::*)()) [with T = const Bar; typename Identity<T>::type = const Bar] Foo(T*, void (Identity<T>::type::*m)(void)); ^ Replacing 'Identity<T>::type' with 'T' makes the problem go away. Source accepted by gcc-4.8 and Clang.