The following code can't be compiled by gcc 4.0.2: class Base { public: class Nested {}; };
class Derived:public Base { public: class Nested { public: void m(); }; class AnotherNested { friend class Nested; // gcc 4.0.2 takes it as 'Base::Nested' //friend class Derived::Nested; // this is needed in order to be compiled by gcc 4.0.2 #line 14 AnotherNested() {} }; }; void Derived::Nested::m() { #line 18 Derived::AnotherNested instance; } should the first friend decl refer to Base::Nested or Derived::Nested? The code is refused by gcc 4.0.2: a.cpp: In member function 'void Derived::Nested::m()': a.cpp:14: error: 'Derived::AnotherNested::AnotherNested()' is private a.cpp:18: error: within this context because gcc 4 takes for granted the friend refers to Base::Nested. However, e.g. gcc 3.4 takes it as Derived::Nested. Declaring the friend the second way: friend class Derived::Nested; works in gcc 4.0.2, but it uses not-yet-fully-declared class Derived, which e.g. can't be compiled by VC 6.0. -- Summary: friend class nested in derived class problem Product: gcc Version: 4.0.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tomas dot sieger at seznam dot cz http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25492