2013-10-04 25 views
18

我在聲明模板類型時遇到很大困難,如下所示。`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; 
} 

我得到錯誤

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

約行

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

我這樣做是因爲我想避免編寫類型名富::酒吧throught我的代碼。

我在做什麼錯?

回答

29

C++中的typedef聲明不能作爲模板。然而,C++ 11添加使用using聲明來實現參數化類型別名替代語法:

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

現在你可以使用:

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

謝謝!你們所有人都有同樣的幫助。我希望我能接受收到的所有三個答案。無論如何,我會投三個答案。 – geraldCelente

+2

@geraldCelente:我不認爲這很重要,或者任何人都不高興 - 選擇你認爲最有用的答案:-)(或者投擲一枚硬幣。) –

+0

有沒有一個庫(例如:boost)提供了一個「backaround 「對於仍然脫離C++ 11流行的編譯器(比如gcc/mingw編譯器)? –

5

typedef「s不能是模板。這正是C++ 11發明別名模板的原因。嘗試

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

謝謝!你們所有人都有同樣的幫助。我希望我能接受收到的所有三個答案。無論如何,我會投三個答案。 – geraldCelente

5

您不能typedef模板。但是,您可以使用別名模板。下面的代碼演示了使用固定的幾個其他問題,也:

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

謝謝!你們所有人都有同樣的幫助。我希望我能接受收到的所有三個答案。無論如何,我會投三個答案。 – geraldCelente

0

希望也沒關係增加後期的答案...

我仍然在使用不出現執行別名模板VS2012 ,所以我爲了我的目的而使用了這種調合物:

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

... 

MAP_THREADS(T) mapThreads; 

對不起,它沒有演示原始的例子,但你得到的漂移。

相關問題