declaración de la plantilla de `typedef typename Foo<T>::Barra de Bar»

Estoy encontrando grandes dificultades en la declaración de 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;
}

Tengo un error

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

sobre la línea de

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

Estoy haciendo esto porque quiero evitar tener que escribir el nombre Foo::Barra a través de mi código.

¿Qué estoy haciendo mal?

4 Kommentare

  1. 34

    La typedef declaración en C++ no puede ser una plantilla. Sin embargo, C++11 añadido una sintaxis alternativa mediante la using declaración para permitir parametrizar el tipo de alias:

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

    Ahora usted puede utilizar:

    Bar<int> x;   //is a Foo<int>::Bar
    • Gracias! todos ustedes han sido igualmente útil. Me gustaría poder aceptar todas las tres respuestas recibidas. De todos modos yo voy a votar hasta los tres respuesta.
    • Yo no creo que importe o cualquiera estaría molesto — escoja cualquier respuesta que te parezca más útil 🙂 (O lanzar una moneda.)
    • hay una biblioteca (por ejemplo: boost), que proporciona un «backaround» para los compiladores que todavía están cayendo fuera de la de C++11 de carro (como el gcc/mingw compiladores)?
  2. 8

    typedef‘s no puede ser de plantillas. Esta es exactamente la razón de C++11 inventado alias plantillas. Trate de

    template <class T>
    using Bar = typename Foo<T>::Bar;
    • Gracias! todos ustedes han sido igualmente útil. Me gustaría poder aceptar todas las tres respuestas recibidas. De todos modos yo voy a votar hasta los tres respuesta.
  3. 8

    Usted no puede typedef una plantilla. Sin embargo, puede utilizar un alias de la plantilla. El código siguiente muestra el uso y corregido 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;
    }
    • Gracias! todos ustedes han sido igualmente útil. Me gustaría poder aceptar todas las tres respuestas recibidas. De todos modos yo voy a votar hasta los tres respuesta.
  4. 0

    Espero que sea bueno para agregar a finales de respuestas…

    Yo sigo con VS2012 que no aparece para implementar alias de plantillas, así que he recurrido a este brebaje 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 siento, no demuestra el ejemplo original, pero usted consigue la deriva.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein