https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86876
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |RESOLVED Resolution|--- |INVALID --- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to rockeet from comment #0) > // code: > #include <stdio.h> > template<class T> > struct A { > template<class U> > struct X { > void foo(U* p) { printf("p->a = %d\n", p->a); } > }; > }; > template<class T> > struct B { > typedef typename A<T>::template X<B<T> > X; > // friend typename X; // g++ fail It's not helpful to report a compilation failure for code with the problem commented out. You need to provide the code that produces the error. Anyway, this is invalid. The C++ grammar says a typename-specifier must be one of: typename nested-name-specifier identifier typename nested-name-specifier simple-template-id typename nested-name-specifier template simple-template-id As the compiler says, a nested-name-specifier is expected, and so your code is invalid.