2013-10-04 13 views
18

Sto riscontrando una grande difficoltà nel dichiarare un tipo di modello come mostrato di seguito.dichiarazione modello di `typedef typename Foo <T> :: Bar Bar '

#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; 
} 

ottengo errore

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

sulla linea

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

sto facendo questo perché voglio evitare di scrivere typename Foo :: Bar ATTRAVERSO mio codice.

Cosa sto sbagliando?

risposta

29

La dichiarazione typedef in C++ non può essere un modello. Tuttavia, C++ 11 ha aggiunto una sintassi alternativa utilizzando la dichiarazione using per consentire di tipo alias parametrizzati:

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

Ora è possibile utilizzare:

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

Grazie! tutti voi siete stati ugualmente di aiuto. Vorrei poter accettare tutte e tre le risposte ricevute. Comunque voterò tutte e tre le risposte. – geraldCelente

+2

@geraldCelente: Non penso che importi o qualcuno sarebbe sconvolto: scegli la risposta che ritieni più utile :-) (oppure lancia una moneta) –

+0

c'è una libreria (es: boost) che fornisce un "backaround" "per i compilatori che stanno ancora cadendo dal C++ 11 bandwagon (come i compilatori gcc/mingw)? –

5

typedef 's non possono essere modelli. Questo è esattamente il motivo per cui C++ 11 ha inventato i modelli alias. Prova

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

Grazie! tutti voi siete stati ugualmente di aiuto. Vorrei poter accettare tutte e tre le risposte ricevute. Comunque voterò tutte e tre le risposte. – geraldCelente

5

Non è possibile typedef un modello. Tuttavia, puoi utilizzare un modello di alias. Il seguente codice illustra l'uso e fissato un paio di altri problemi, anche:

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; 
} 
+0

Grazie! tutti voi siete stati ugualmente di aiuto. Vorrei poter accettare tutte e tre le risposte ricevute. Comunque voterò tutte e tre le risposte. – geraldCelente

0

Spero che va bene per aggiungere le risposte in ritardo ...

sto ancora utilizzando VS2012 che non sembra di implementare modelli di alias , così ho fatto ricorso a questo intruglio per i miei scopi:

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

... 

MAP_THREADS(T) mapThreads; 

Ci dispiace che non si dimostrano l'esempio originale, ma si ottiene la deriva.

Problemi correlati