typedef sirve para definir un alias:
Código C++:
Ver originaltypedef unsigned int miUint;
miUint dato; // el tipo real de dato es unsigned int
A partir del estándar C++11 también se puede usar
using:
Código C++:
Ver originalusing miUint = unsigned int;
miUint dato; // el tipo real de dato es unsigned int
por otro lado, lo que se está intentando en esa línea es asignar un alias basándose en un tipo que proviene de un template.
Para explicarlo voy a usar un ejemplo tonto ad-hoc.
imagínate que tienes una colección de clases que, entre otras cosas, cada una te proporciona un tipo de dato de la siguiente forma:
Código C++:
Ver originalstruct dummy1
{
typedef char tipoConcreto;
};
struct dummy2
{
typedef int tipoConcreto;
};
Ahora imagina que necesitas crear un template que ha de tener una variable cuyo tipo ha de coincidir con el de un
tipoConcreto en particular. Un primer acercamiento podría ser:
Código C++:
Ver originaltemplate<typename T>
struct TypeTemplate
{
typedef T::tipoConcreto t;
t variable;
};
pero claro, si intentamos usar este template directamente en nuestro código nos encontraremos con un bonito error de compilación. El problema es que T::tipoConcreto no es un nombre cualificado, es dependiente de la especialización que usemos. En estos casos necesitamos usar
typename. Tómalo como una protección que te exige el compilador para asegurarse de que sabes lo que estás haciendo.
Código C++:
Ver originaltemplate<typename T>
struct TypeTemplate
{
typedef typename T::tipoConcreto t;
t variable;
};
Ahora ya no da errores de compilación y podemos probar nuestro código:
Código C++:
Ver originalint main()
{
TypeTemplate<dummy1> miTemplate1;
TypeTemplate<dummy2> miTemplate2;
miTemplate1.variable = 60;
miTemplate2.variable = 60;
std::cout << miTemplate1.variable << " " << miTemplate2.variable;
}
La salida del programa será:
En primer lugar ha imprimido un carácter, puesto que
dummy1::tipoConcreto es de tipo
char. Concretamente ha imprimido el carácter 60. A continuación imprime un entero, ya que
dummy2::tipoConcreto es de tipo
int.
Espero que con este ejemplo haya quedado resuelta la duda.
Un saludo.