"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

Reply via email to