http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45942
--- Comment #14 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-10-09 18:07:42 UTC --- (In reply to comment #13) > The reason that I did not succeed in making ClassB a friend of ClassA is that > C++ is not very logical. Maybe so, but that's not a bug in GCC. The next version of C++ is more lenient in what is allowed in a friend declaration and I think it is possible to declare a typedef as a friend so you could create a class template with a nested member and declare that member as a friend. That template could be specialized to make certain specializations of classB a friend: template<class T, int C, class AA> struct Befriender { typedef int type; }; template<class T, int C> struct Befriender<T, C, A<T,C>> { typedef B<T,C,A<T,C>&> type; }; template<class T, int C> class A { friend typename Befriender<T,C,A>::type; }; I *think* this would work, when Befriender::type results in "friend int" it is ignored, without error.