Re: What's the correct syntax for a friend with template parameters?
Andy Champ wrote:
We have a class with something that, simplified, looks like this:
template <typename T> class foo
{
T beyondAllReaching;
// In VC2005, this works OK
template <typename U> friend void method(foo<T> l, foo<U> r);
// But VC2008 requires this
template <typename U, class V> friend void method(U l, V r);
};
// To allow the actual function to access the private data.
template <typename T, typename U> void method(foo<T> l, foo<U> r)
This is a function template with 2 template arguments. Shouldn't the
'friend' declaration also have 2 template arguments? That's the reason
for the correct syntax (you marked it as VC2008).
{
l.beyondAllReaching = r.beyondAllReaching;
}
It occurs to me writing this that method<int, char> is not a friend of
foo<char> - so I'm a bit surprised that either works.
Actually, that's not true, the friend declaration declares *any*
instantiation of 'method' function template to be a friend of *any*
'foo' class template instantiation.
> But that isn't
the main point. I want to know:
- Which is the correct syntax?
To declare what, exactly?
- Is there a way to stop a method<string, string> accessing the privates
of a foo<char>?
'fraid not. Partial specialisations aren't allowed in friend
declarations. Also, there are no partial specialisations of function
templates.
template<class T> class foo;
template<class A, class B> void method(foo<A>, foo<B>);
template<typename T> class foo
{
T beyondAllReaching;
template<class S, class U> friend void method(foo<S> l, foo<U> r);
};
template<class A, class B> void method(foo<A> fa, foo<B> fb)
{
fa.beyondAllReaching = 0;
fb.beyondAllReaching = 0;
foo<double> fd;
fd.beyondAllReaching = 3.14159; // oops. Didn't want that...
}
int main()
{
foo<int> fi;
foo<char> fc;
method(fi, fc);
}
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask