2012-11-06 26 views
0

可能重复:
Why do I need to use typedef typename in g++ but not VS?不能脱离的std ::向量继承的类的typedef迭代

我定义的模板类,如下所示

template <class T> 
class MyVector : public std::vector<boost::shared_ptr<T>> 
{ 
public: 
    typedef MyVector::iterator MyIter; 
}; 

我得到在typedef处出现此错误MyIter

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

我正在编译使用VS 2010,我确定包含vectorboost::shared_ptr都存在。如果我删除了模板T并将其替换为int,则所有内容均无错地编译。

我错过了什么?我想定义一个模板类和typedef迭代器。

+1

尝试在'typedef'和'MyVector'之间放置'typename'。请参阅[哪里,为什么我必须把“模板”和“typename”关键字?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-该模板,和类型名称的关键字)。 – jrok

+2

请参阅参数&公共继承的'std :: vector <>':http://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector –

+0

也读有用的书“Exceptional C++ “这个问题很清楚 – linello

回答

4

这个问题是很好的在这里找到答案: Why do I need to use typedef typename in g++ but not VS?

不过长话短说,你必须使用关键字类型名这样:因为在第一遍

typedef typename MyVector::iterator MyIter; 

(验证模板语法)编译器并不真正知道如果MyVector :: iterator是一个类型或变量(它实际上将在专门的模板上)。所以暗示它是一种类型可以解决问题。