The following code compiles. It shouldn't. The operator+ should not be found. According to 3.4.2/2, the associated namespace of a type includes those of its bases and of its template arguments, but not its bases' template arguments.
namespace N { struct S {}; template<class T, class U> void operator+(T const &, U const &) {} } template<class T> struct X {}; struct Y : X<N::S> {}; int main() { Y y; y+y; // this should fail. } -- Summary: Overeager ADL searches associated namespaces of base class's template arguments Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: eric dot niebler at gmail dot com GCC build triplet: g++ 4.3.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38242