https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61421
--- Comment #11 from mimamer at gmail dot com --- In short form, template<class T> class list2 { public: struct node { T *next; T *prev; }; node anchor; public: /* API */ } struct Obj : list2<Obj>::node { /* obj-specific elements */ } list2<Obj> main_list; So, anchor is of type list2<Obj>::node while Obj is derived from list2<Obj>::node.