"Gianni Mariani" <gi*******@mariani.ws> wrote in message

news:be********@dispatch.concentric.net...

I have 2 distinct template classes which co-operate, hence are friends.

However, I can't seem to figure out what syntax to use to make this
work.

What is the right(tm) way to write a friend class here ?

Here is the code:

template <typename A>

class Y;

template <typename A>

class X

{

friend class Y<A>;

private:

A m_a;

public:

X( A i_val );

template<typename B> void DoThing( Y<B> & b )

{

m_a = b.m_a;

}

};

template <typename A>

class Y

{

friend class X<A>;

private:

A m_a;

public:

Y( A i_val );

template<typename B> void DoOtherThing( Y<B> & b )

{

m_a = b.m_a;

}

};

int main()

{

Y<int> yi( 1 );

X<short> xs( 2 );

xs.DoThing( yi );

}

Here is the error:

g++ -c -o testfriend.o testfriend.cpp

testfriend.cpp: In member function `void X<A>::DoThing(Y<B>&) [with B =

int, A

= short int]':

testfriend.cpp:52: instantiated from here

testfriend.cpp:31: error: `int Y<int>::m_a' is private

testfriend.cpp:20: error: within this context

make: *** [testfriend.o] Error 1

You have to distinguish between

1) All template instances are friends of each other, e.g. X<int> is a friend

of Y<double>

2) Only templates instantiated with the same type are friend of each other,

e.g. X<int> is a friend of Y<int> but not of Y<double>.

You want case 1, but the code you've written is for case 2. Try this

template <typename A>

class Y;

template <typename A>

class X

{

template <typename B>

friend class Y;

etc.

john