2012-01-29 198 views
1

在.HPP文件我有的typedef嵌套模板類

template <SomeEnum E> 
class SomeClass { 
    //many definitions 
    class InnerClass { 
     //Some stuff 
    }; 
    typedef std::map<std::string, InnerClass> InnerMapType; 
}; 

在.cpp文件我有

template <SomeEnum E> 
SomeClass<E>::~SomeClass() { 
    InnerMapType::iterator iter; 
    //Iterate over resources 
} 

編譯器提供了語法錯誤InnerMap::iterator iter;聲稱分號ITER之前的預期。如果我刪除template <SomeEnum E>部分,編譯器很高興。我忘了什麼,如何使它工作?

+0

什麼阻止你縮進你的代碼? – 2012-01-29 14:32:43

+0

@LightnessRacesinOrbit,因爲預覽沒有顯示語法突出顯示,我希望語法和縮進在我發佈後會自動出現。 謝謝。 – Muxecoid 2012-01-29 14:46:41

回答

3

看看dependent names

爲了解決你的問題,你需要使用類型名稱:

template <SomeEnum E> 
SomeClass<E>::~SomeClass() { 
    typename InnerMapType::iterator iter; 
    //Iterate over resources 
} 
+0

謝謝,這有幫助。 瑣事問題:你知道編譯器爲什麼說「缺少分號」而不是給出一個人類可讀的錯誤信息嗎? – Muxecoid 2012-01-29 14:34:59

+1

取決於編譯器的性能。 Comeau會說「error:nontype'InnerMapType :: iterator'不是一個類型名稱」 – 2012-01-29 14:46:02

+0

後來的編譯器版本更傾向於使用模板錯誤。是的,除了行號 – 2012-01-29 14:59:10