使用模板化类的成员类型作为类成员变量的类型

时间:2012-05-18 00:04:02

标签: c++ templates

为什么以下不能编译(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作为类型,但不能作为成员变量的类型。

1 个答案:

答案 0 :(得分:4)

这是typename的情况。简短的回答,你需要这样做:

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

答案很长,编译器不知道std::vector< M >::iterator解析的内容,因为M可以是任何内容,并且std::vector可以为其专门化。具体来说,它无法判断std::vector< M >::iterator是类型还是值,并且它认为它是一个值。您必须通过插入typename来明确地告诉编译器它的类型。