2013-10-04 20 views
18

Znam trudności przy zadeklarowaniu typu szablonowego, jak pokazano poniżej.Deklaracja szablonu `typedef nazwa_pliku 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; 
} 

mi się błąd

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

o linię

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

Robię to, ponieważ chcę uniknąć pisania typename Foo :: Bar przechadzkę mój kod.

Co robię źle?

Odpowiedz

29

Deklaracja typedef w C++ nie może być szablonem. Jednakże, C++ 11 dodaje alternatywną składnię przy użyciu deklaracji using aby umożliwić sparametryzowanych aliasy Typ:

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

Teraz można użyć:

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

Dziękujemy! wszyscy byliście równie pomocni. Chciałbym móc przyjąć wszystkie trzy otrzymane odpowiedzi. W każdym razie zagłosuję na wszystkie trzy odpowiedzi. – geraldCelente

+2

@geraldCelente: Nie wydaje mi się, żeby to miało znaczenie, a nikt nie byłby zmartwiony - wybierz jakąkolwiek odpowiedź, którą uznasz za najbardziej użyteczną :-) (Lub rzuć monetą.) –

+0

Czy istnieje biblioteka (np .: boost), która zapewnia "rezerwę? "dla kompilatorów, które wciąż spadają z modemu C++ 11 (jak kompilatory gcc/mingw)? –

5

typedef „s nie może być szablony. Właśnie z tego powodu C++ 11 wymyślił szablony aliasów. Wypróbuj

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

Dziękujemy! wszyscy byliście równie pomocni. Chciałbym móc przyjąć wszystkie trzy otrzymane odpowiedzi. W każdym razie zagłosuję na wszystkie trzy odpowiedzi. – geraldCelente

5

Nie możesz typedef szablonu. Możesz jednak użyć szablonu aliasu. Poniższy kod demonstruje użycie i naprawiono kilka innych problemów, za:

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

Dziękujemy! wszyscy byliście równie pomocni. Chciałbym móc przyjąć wszystkie trzy otrzymane odpowiedzi. W każdym razie zagłosuję na wszystkie trzy odpowiedzi. – geraldCelente

0

nadzieję, że to w porządku, aby dodać późno odpowiedzi ...

Nadal używam VS2012, które nie wydają się wdrożyć alias szablony , więc uciekają się do tej mikstury do moich celów:

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

... 

MAP_THREADS(T) mapThreads; 

Niestety nie wykazać oryginalny przykład, ale masz dryfu.

Powiązane problemy