ADL Help

Perry Smith pedz@easesoftware.com
Tue Nov 7 15:02:00 GMT 2006


On Nov 6, 2006, at 4:20 PM, Ian Lance Taylor wrote:

> Perry Smith <pedz@easesoftware.com> writes:
>
>> There are several pages just like it.  In particular this bullet  
>> would
>> seem to apply but it must not for some reason:
>>
>> | If T is a class type, its associated classes are the class  
>> itself and
>> | its direct and indirect base classes. Its associated namespaces are
>> | the namespaces in which its associated classes are defined.
>>
>> It seems like the "here 1" version would be found but it is not.  Can
>> you help me to understand what I'm missing?
>
> Argument dependent lookup never finds a member function of a class.
> It only finds functions declared in namespaces.
>
> Don't get confused by the stuff about "associated classes."  Argument
> dependent lookup doesn't look at the member functions of an associated
> class.  ADL does look at the friend functions of associated classes--
> that's why the concept of associated classes exists.

Thank you so much to Ian.  I went back and re-read some of my  
template books as well as the spec.  As Ian points out, the classes  
are not searched -- except for friends...  Here is a simple example.   
As is, it compiles and runs.  Remove the #if 0 and it does not  
compile -- the compiler can not find "unfriendly".

Thank you again...


#include <iostream>

template <typename T>
class C {
     friend void friendly(C<T> const &a)
     {
	std::cout << "friendly" << std::endl;
     }

     static void unfriendly(C<T> const &a)
     {
	std::cout << "unfriendly" << std::endl;
     }
};

int main()
{
     C<int>p;

     friendly(p);
#if 0
     unfriendly(p);
#endif
}



More information about the Gcc-help mailing list