c++ templates typedef typename

c++ - Declaración de plantilla de `typedef typename Foo<T>:: Bar Bar ''



templates (4)

Espero que esté bien para agregar respuestas tardías ...

Todavía estoy usando VS2012, que no parece implementar plantillas de alias, así que recurrí a esta concocción para mis propósitos:

//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won''t compile #define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> > ... MAP_THREADS(T) mapThreads;

Lo sentimos, no muestra el ejemplo original, pero obtienes la deriva.

Estoy encontrando una gran dificultad para declarar un tipo de plantilla como se muestra a continuación.

#include <cstdlib> #include <iostream> using namespace std; template <class T> class Foo { typedef T Bar; }; template <class T> typedef typename Foo<T>::Bar Bar; int main(int argc, char *argv[]) { Bar bar; Foo<int> foo; system("PAUSE"); return EXIT_SUCCESS; }

Me da error

template declaration of `typedef typename Foo<T>::Bar Bar''

sobre la linea

template <class T> typedef typename Foo<T>::Bar Bar;

Estoy haciendo esto porque quiero evitar escribir el nombre tipográfico Foo :: Bar a través de mi código.

¿Qué estoy haciendo mal?


La declaración typedef en C ++ no puede ser una plantilla. Sin embargo, C ++ 11 agregó una sintaxis alternativa mediante el using declaración para permitir alias de tipos parametrizados:

template <typename T> using Bar = typename Foo<T>::Bar;

Ahora puedes usar:

Bar<int> x; // is a Foo<int>::Bar


No puedes typedef una plantilla. Sin embargo, puede utilizar una plantilla de alias. El siguiente código demuestra el uso y solucionó algunos otros problemas, también:

template <class T> class Foo { public: typedef T Bar; }; template <class T> using Bar = typename Foo<T>::Bar; int main(int argc, char *argv[]) { Bar<int> bar; Foo<int> foo; }


typedef ''s no pueden ser plantillas. Esta es exactamente la razón por la que C ++ 11 inventó las plantillas de alias. Tratar

template <class T> using Bar = typename Foo<T>::Bar;