2014-01-05 82 views
5

在C++中,我試圖爲我的模板類獲取std::vector::iterator。但是,當我編譯它時,出現錯誤:error C2146: syntax error : missing ';' before identifier 'iterator'error C4430: missing type specifier - int assumed. Note: C++ does not support default-int。我也得到警告:warning C4346: 'std::vector<T>::iterator' : dependent name is not a typeC++模板std :: vector :: iterator錯誤

#include <vector> 
template<class T> class v1{ 
    typedef std::vector<T>::iterator iterator; // Error here 
}; 
class v2{ 
    typedef std::vector<int>::iterator iterator; // (This works) 
}; 

我甚至試過

template<typename T> class v1{ 
    typedef std::vector<T>::iterator iterator; 
}; 

而且

template<typename T = int> class v1{ 
    typedef std::vector<T>::iterator iterator; 
}; 
+0

可能的重複[哪裏和爲什麼我必須放置「模板」和「typename」關鍵字?](http://stackoverflow.com/問題/ 610245 /爲什麼要把模板和類型名稱關鍵字) – juanchopanza

+1

clang ++已知有相當不錯的錯誤消息,尤其是對於這類錯誤。在這種情況下,它表示*錯誤:在依賴類型名稱之前缺少'typename'std :: vector :: iterator'*。如果您無法理解來自其他編譯器的錯誤消息,我建議嘗試使用clang(例如,在線編譯器)。 – dyp

+0

@DyP GCC有類似的錯誤消息。 – Rapptz

回答

21

std::vector<T>::iteratordependent name,所以你需要在這裏一個typename指定它是指到一個類型。否則它被認爲是指非類型:

typedef typename std::vector<T>::iterator iterator;