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;