Koenig lookup doesn't seem to work properly when dealing with template friends defined within a class. Friends defined within the definition of a class shouldn't be visible to the enclosing namespace, and should only be able to be found via Koenig lookup. I see that this appears to work as expected for normal friends, but GCC still appears make the name visible for template friends.
I think that this behaviour is incorrect, but could I be missing something? The Comeau C++ with EDG front end seems to agree with my reading of the spec, but then its possible that its behaviour is incorrect instead. In the following test program, I think that tests #5 and #7 should fail to compile, but do not. Neither bar(int, int) and bar(Foo, int) contain an associated class to class Bar and therefore should not be found. Thanks! Andy #include <iostream> struct Bar; struct Foo { Foo() { } Foo(const Bar &src) { std::cout << "Bar->Foo" << std::endl; } Foo(int src) { std::cout << "int->Foo" << std::endl; } friend void foo(const Foo &a, int b) { std::cout << "Foo " << b << std::endl; } }; struct Bar { operator int() { return(9); } // for test 9 template<typename A, typename B> friend void bar(const A &a, B b) { std::cout << "Bar " << b << std::endl; } }; int main(int argc, char *argv[]) { Foo f; Bar b; //foo(1, 0); // #0 - EDG, MSVC 8, GCC 4.1.2 no yes via conversion ctor foo((Foo)1, 1); // #1 ok via conv ctor foo(f, 2); // #2 ok //foo(b, 3); // #3 EDG no, GCC 4.1.2 no, MSVC 8 yes via conv ctor foo((Foo)b, 4); // #4 ok via conv ctor bar(1, 5); // #5 EDG, MSVC 8 no, GCC 4.1.2 yes bar(b, 6); // #6 ok bar(f, 7); // #7 EDG no, MSVC 8, GCC 4.1.2 yes bar(b, "8"); // #8 ok bar(f, b); // #9 ok return(0); } -- Summary: template friends and Koenig lookup Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: andrew dot olson at hughes dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31336