By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
434,969 Members | 2,493 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 434,969 IT Pros & Developers. It's quick & easy.

What's the correct syntax for a friend with template parameters?

P: n/a
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)
{
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. But that isn't
the main point. I want to know:

- Which is the correct syntax?
- Is there a way to stop a method<string, stringaccessing the privates
of a foo<char>?

Thanks

Andy
Jul 9 '08 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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
Jul 9 '08 #2

P: n/a
Victor Bazarov wrote:
>
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.
Ah. That's not *quite* what I wanted, but that's the language so...

Thanks

Andy
Jul 10 '08 #3

This discussion thread is closed

Replies have been disabled for this discussion.