https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86876
Bug ID: 86876 Summary: friend typedef'ed class in template class can not compile Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: rockeet at gmail dot com Target Milestone: --- // 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 friend typename B::X; // g++ ok private: int a = 1234; }; int main() { B<int> a; B<int>::X().foo(&a); return 0; } /* Compile error: template_friend.cpp:12:21: error: expected nested-name-specifier before ‘X’ friend typename X; // g++ fail ^ template_friend.cpp:12:21: error: ‘X’ is neither function nor member function; cannot be declared friend template_friend.cpp:12:21: error: ‘int B<T>::X’ conflicts with a previous declaration template_friend.cpp:11:43: note: previous declaration ‘typedef typename A<T>::X<B<T> > B<T>::X’ typedef typename A<T>::template X<B<T> > X; ^ template_friend.cpp: In instantiation of ‘void A<T>::X<U>::foo(U*) [with U = B<int>; T = int]’: template_friend.cpp:19:20: required from here template_friend.cpp:6:45: error: ‘int B<int>::a’ is private within this context void foo(U* p) { printf("p->a = %d\n", p->a); } ~~~^ template_friend.cpp:15:10: note: declared private here int a = 1234; ^~~~ */