C++98 [temp.local] says "Within the scope of a class template specialization or partial specialization, when the name of the template is neither qualified nor followed by <, it is equivalent to the name of the template followed by the template-arguments enclosed in <>." That does not work when a template specialization is used as a base class. In that case g++ does not accept the unqualified base class name as a type.
This test case: template <class T> struct base {}; struct derived : base<int> { typedef base b; base* p; }; gives these errors: foo.cc:5: error: invalid use of template-name base without an argument list foo.cc:6: error: ISO C++ forbids declaration of base with no type foo.cc:6: error: expected ; before * token I believe this is an incorrect rejection of valid C++ code. At least, I can't find anything in the C++ standard which says that this code is invalid. -- Summary: Specialized template base class name not accepted Product: gcc Version: 4.4.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: ian at airs dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37350