En C++, se necesita la palabra clave typename
para que el compilador pueda desambiguar entre los tipos anidados y los valores anidados en las plantillas. Sin embargo, hay ciertas situaciones en las que no es posible la ambigüedad, como cuando una clase derivada hereda de un tipo de clase anidada.Uso de la palabra clave typename con los parámetros de función de plantilla
template <class T>
class Derived : public T::type
{ };
Aquí no se requiere la palabra clave typename
, y es, de hecho, ni siquiera permitido. Esto tiene sentido, porque el contexto elimina la ambigüedad. Aquí, T::type
debe hacer referencia a un tipo, ya que obviamente no puede heredar de un valor.
Creo que lo mismo sucedería con los parámetros de la plantilla de función.
template <class T>
void foo(const T::type& v)
{
}
En este caso, el contexto deja claro que T::type
debe hacer referencia a un tipo, ya que un parámetro de la función no puede ser un valor. Sin embargo, el compilador no acepta esto. Quiere const typename T::type&
. Esto parece inconsistente ¿Por qué el lenguaje permite la suposición implícita de un tipo anidado en el contexto de la herencia, pero no en el contexto de los parámetros de la función? En ambos casos no puede haber ambigüedad, entonces ¿por qué la necesidad de typename
en uno pero no en el otro?
Esta es una pregunta muy interesante. –
Los miembros del comité de C++ son humanos. Envíe un cambio propuesto para el siguiente estándar. –
@ Channel72 durante mi breve contacto con las plantillas Me he dado cuenta de que hay muchas más reglas inconsistentes y no ortogonales. No puedo decir que las plantillas estuvieran mal diseñadas, pero definitivamente hay espacio (habitación de invitados, no una pequeña sala de cajas) para mejorar. –