This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH for friend/template/inline link-failure
>>>>> "Alexandre" == Alexandre Oliva <oliva@dcc.unicamp.br> writes:
Alexandre> Mark Mitchell <mark@markmitchell.com> writes:
>> template <class P1> struct S1 { struct SS1 { }; friend void Foo
>> (const SS1& ss1) { } };
Alexandre> In this case, I think Foo is a non-template function,
Alexandre> so it must be explicitly defined for each type
Alexandre> S1<P1>::SS1. A template definition won't do.
You're right, and, then again, you're not. :-)
Given:
template <class T> struct S { friend void f(T) {} };
There is presently no global `f'. After:
template struct S<int>;
There is now a global function `void f(int)'. It is not a template
instance, but it does have a definition. In many ways it is *like* a
template instantiation, so far as the compiler is concerned, but it's
just a non-template function so far as the language is concerned. If
you did:
S<double> s2;
you'd now have `void f(double)' as well.
--
Mark Mitchell mark@markmitchell.com
Mark Mitchell Consulting http://www.markmitchell.com