2012-05-18 117 views
0

爲什麼下面不能編譯(MSVC10 - 但我懷疑它不是有效的C++),並且有沒有解決方法?使用成員類型的模板類作爲類成員變量

template <typename M> 
struct MyClass 
{ 
    typedef std::vector<M>::iterator iteratorT; 

    iteratorT myIterator; 

}; 

錯誤是error C2146: syntax error : missing ';' before identifier 'iteratorT'。我已經嘗試了一堆變體,結果相同:可以使用std::vector<M>::iterator作爲成員函數中的類型,但不能將其作爲成員變量的類型。

+0

一個相當常見的FAQ。看到這裏http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18 – AnT

+0

謝謝 - 我不知道該找什麼來尋找答案! – Zero

回答

4

這是typename的一種情況。簡短的回答,你需要做的這個代替:

typedef typename std::vector<M>::iterator iteratorT; 

朗的答案,編譯器不知道什麼std::vector<M>::iterator解析爲M可以是任何東西,而且有可能它是std::vector專業化。具體而言,它不能分辨std::vector<M>::iterator是一種類型還是一個值,並且它認爲它是一個值。你必須通過插入typename來明確告訴編譯器它的類型。

+0

D'oh!白癡時刻。我很習慣MSVC不需要'typename',我傾向於把它看作一個'gcc'問題! – Zero

+0

@零:是的,它非常不幸MSVC沒有正確實現兩階段模板查找。 –