http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45942
--- Comment #13 from Michiel <MichieldeB at aim dot com> 2010-10-09 13:38:05
UTC ---
The reason that I did not succeed in making ClassB a friend of ClassA is that
C++ is not very logical. See below.
template <class T, int C> class classB;
template <class T, int C, class V> class classC;
template <class T, int C> class classA
{
// classA<char,128> does NOT become friends with classA<short,512>
friend class classB<T,C>;
// with an extra template argument, this is only possible via
// specialization, which is not allowed
template <> friend class classB<T,C>;
template <class V> friend class classC<T,C,V>;
// because with your solution, classA<char,128> (classB<char,128,short>)
// DOES become friends with classA<short,512> (classB<short,512,short>)
template <class TT, int CC> friend class classB;
template <class TT, int CC, class VV> friend class classC;
};
template class classA<char,128>;