"Richard Guenther" <[EMAIL PROTECTED]> writes:
> On Jan 17, 2008 2:12 PM, Dragan Milenkovic <[EMAIL PROTECTED]> wrote:
> > Richard Guenther wrote:
> > [snip]
> > >> template <typename T>
> > >> struct Foo
> > >> {
> > >> template <typename Z>
> > >> friend void func(const Foo &);
> > >> };
> > >>
> > >> void check(const Foo<int> & x)
> > >> {
> > >> // Foo<int> weird; // uncomment this line and all works
> > >>
> > >> func<int>(x); // <-- ERROR
> > >> }
> > >>
> > >>
> > >> Tested with gcc 4.0 - 4.3, and all behave the same:
> > >>
> > >> "error: 'func' was not declared in this scope"
> > >>
> > >> but it works if you uncomment the weird line.
> > >
> > > Actually even with the weird line the program is invalid. What are
> > > you trying to do? ;)
> > >
> > > Richard.
> >
> > Ok... afaik, that func should be defined on that very place where it is
> > declared as friend. But could you please elaborate why it is invalid,
> > since you made me start questioning my C++ knowledge... :-D
>
> How should name-lookup find func?
It should use argument dependent lookup. This is like the common case
of
class x
{
friend x operator+(const& x, const& x) { return x.var + x.var; }
};
in which x::operator+ is found without taking special action.
Ian