usar nombre de clase en una plantilla de clase sin parámetros de plantilla

el código proviene de un libro de C ++ como a continuación:

¿Por qué este miembro público Link * next no tiene argumento typename?

template  class Link { private: static Link* freelist; public: E element; Link* next; // this line confused me.... Link(const E& elemval, Link* nextval = NULL) { element = elemval; next = nextval; } Link(Link* nextval = NULL) { next = nextval; } void* operator new(size t){ if (freelist == NULL) return ::new Link; Link* temp = freelist; freelist = freelist->next; return temp; // Return the link } }; 

Creo que debería ser Link* next .

Por favor, dime la razón por la que no tiene un argumento de plantilla.

Esto se conoce como el “nombre de clase inyectado”. La regla viene específicamente de [temp.local]:

Al igual que las clases normales (sin plantilla), las plantillas de clase tienen un nombre de clase inyectado (Cláusula 9). El nombre de la clase inyectada se puede usar como un nombre de plantilla o un nombre de tipo . Cuando se usa con una plantilla-argumento-lista , como un argumento-plantilla para una plantilla -parámetro-plantilla , o como el identificador final en el especificador-tipo-elaborado de una statement de plantilla de clase amiga, se refiere a la plantilla de clase misma . De lo contrario, es equivalente al nombre de la plantilla seguido de los parámetros de plantilla de la plantilla de clase incluida en <> .

Dentro del scope de una especialización de plantilla de clase o especialización parcial, cuando el nombre de clase inyectado se usa como nombre de tipo , es equivalente al nombre de la plantilla seguido de los argumentos de plantilla de la especialización de plantilla de clase o especialización parcial adjunta en <>. [Ejemplo:

 template class T> class A { }; template class Y; template<> class Y { Y* p; // meaning Y Y* q; // meaning Y A* a; // meaning A<::y> class B { template friend class Y; // meaning ::Y }; }; 

-Final ejemplo]

Esto es básicamente por conveniencia, por lo que el nombre de clase dentro de la clase se refiere a la clase en sí y no a nada externo que pueda tener el mismo nombre. Para las plantillas de clase, potencialmente ahorra mucho tipeo si tiene una larga lista de argumentos de plantilla.