2012-01-29 281 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