Re: how to make nested class in a class template a friend of some other class template?
On 8/19/07 4:06 PM, in article
1187557675.894924.130450@k79g2000hse.googlegroups.com, "seaswar"
<drhookeypookey@gmail.com> wrote:
In the following, how do I make class C<T>::N a friend of template
class X<U>. I tried various combinations. None worked. Complains that
X::fx is private. One even caused g++ to dump core.
Thanks
Suresh
template<typename T>
class C;
template<typename U>
class X {
private:
static void fx() { }
//I tried the following which did not work:
template<typename T>
friend class C;
//Neither did this:
template<typename T>
friend class C<T>::N;
//The following dumped core (gcc3.4.4 on cygwin):
template<typename T>
friend void C<T>::N::fn();
};
The friend declaration in X should specify which C template specialization
contains the friend class N. Presumably, the friend N class is to be found
in the C template specialization that has the same template type parameter
as the X specialization itself:
template< typename T>
class C;
template< typename U>
class X
{
private:
static void fx() { }
friend class C<U>::N;
};
template<typename T>
class C {
public:
class N {
public:
void fn()
{
X::fx(); // problematic call
}
};
};
The call to fx() within N::fn() needs to specify to which X specialization
the fx() static method belongs. Since the friend declaration in X makes
C<T>::N a friend of X<T> only, then X<T>::fx() is the only X specialization
whose fx() method is accessible in the current context:
template< typename T>
class C
{
public:
class N
{
public:
void fn()
{
X<T>::fx(); // only X<T> is C<T>::N's friend
}
};
};
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]