Andy Champ wrote:
We have a class with something that, simplified, looks like this:
template <typename Tclass foo
{
T beyondAllReaching;
// In VC2005, this works OK
template <typename Ufriend void method(foo<Tl, foo<Ur);
// But VC2008 requires this
template <typename U, class Vfriend void method(U l, V r);
};
// To allow the actual function to access the private data.
template <typename T, typename Uvoid method(foo<Tl, foo<Ur)
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, charis 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, stringaccessing 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 Tclass foo;
template<class A, class Bvoid method(foo<A>, foo<B>);
template<typename Tclass foo
{
T beyondAllReaching;
template<class S, class Ufriend void method(foo<Sl, foo<Ur);
};
template<class A, class Bvoid method(foo<Afa, foo<Bfb)
{
fa.beyondAllReaching = 0;
fb.beyondAllReaching = 0;
foo<doublefd;
fd.beyondAllReaching = 3.14159; // oops. Didn't want that...
}
int main()
{
foo<intfi;
foo<charfc;
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