http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50306
Bug #: 50306 Summary: g++ accepts code with ambiguous, templated conversion operators Classification: Unclassified Product: gcc Version: 4.6.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: malape...@omnialabs.net This code does not generate an error or warning: class A{}; class B : public A {}; template <class T> class SmartPtr{ public: template<typename OtherT> operator const SmartPtr<OtherT>&() const; template<typename OtherT> operator SmartPtr<OtherT>() const; }; void func(SmartPtr<A>) { } int main() { SmartPtr<B> b; func(b); // this should be ambiguous? } But it is an error with MSVC 10 and Clang 2.8. If the templates on the operators are removed, it also becomes ambiguous with gcc: class A {}; class B : public A {}; template <class T> class SmartPtr { public: operator const SmartPtr<A>&() const; operator SmartPtr<A>() const; }; void func(SmartPtr<A>) { } int main() { SmartPtr<B> b; func(b); // func is ambiguous }