typedef se usa para definir tipos:
-
Por simplicidad, claridad. Por ejemplo,
vector<list<int *>*> temp(10);
Se puede simplificar para:
typedef list<int *> listnum; typedef vector<listnum *> vectornum; vectornum temp(10);
-
Defina un puntero al miembro:
class A { public: virtual void sup() = 0; }; typedef void (A::* pt)(); void f(A *a) { pt ptemp = &A::sup; }
typedef typename
-
template <typename var_name> class class_name; indica que var_name es un tipo, que puede reemplazar cualquier tipo cuando se instancia la plantilla, incluidos no solo los tipos integrados (int, etc.), sino también las clases de tipos personalizados. Esta es la forma en la pregunta, en otras palabras, en plantilla y plantilla, el nombre de tipo y la clase tienen exactamente el mismo significado.
-
typename var_name; significa que la definición de var_name aún no se ha dado, esta declaración generalmente aparece en la definición de la plantilla, por ejemplo:
template <class T> void f() { typedef typename T::A TA; // 声明 TA 的类型为 T::A TA a5; // 声明 a5 的类型为 TA typename T::A a6; // 声明 a6 的类型为 T::A TA * pta6; // 声明 pta6 的类型为 TA 的指针 }
Debido a que T es un tipo que solo se conoce cuando se crea una instancia de la plantilla , el compilador es más ignorante de T :: A. Para informar al
compilador que T :: A es un tipo legal, la declaración typename puede evitar que el compilador informe un error.