typename
La palabra clave typename establece que el siguiente nombre en el código corresponde a un tipo de datos. Tiene dos usos especiales:
[editar] Especificar el Tipo Parámetro de una Plantilla
Al especificar en una plantilla el o los tipos de datos argumentos, typename se puede usar de manera intercambiable con la declaración class. Alexandrescu recomienda usar class explícitamente cuando se desea dejar en claro que la plantilla toma como parámetro una clase, y typename en caso contrario, con el fin de mejorar la legibilidad del código.
[editar] Resolución de Nombres Dependientes
Dentro del código de una plantilla, typename debe usarse para indicar al compilador que el siguiente nombre dependiente es un nombre de un tipo dependiente del argumento en la plantilla:
struct ConTipo { typedef int Tipo; }; struct SinTipo { typedef int NoTipo; }; template<class T> struct Bar { typedef typename T::Tipo BarType; '' Cuando se declara un alias void baz() { typename T::Tipo instance; '' Cuando se declara una variable } }; typedef Bar<ConTipo> Bar1; '' funciona: existe el tipo dependiente ConTipo::Tipo typedef Bar<SinTipo> Bar2; '' error de compilación: no existe el tipo dependiente SinTipo::Tipo
Este tipo de construcción es útil al trabajar con los tipos de datos y alias agregados en iteradores y contenedores compuestos, ya que éstos declaran aliases dependientes como value_type o result_type.