https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61421
--- Comment #12 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to mimamer from comment #11) > 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. Oh you are upcasting from node to T but the variable is of node type only and not T. So this is invalid because of that. You need to use either type node inside the struct node or change anchor to type T instead.