C++ 模板 std::vector::iterator 错误

15
在C++中,我试图为我的模板类获取一个std::vector ::iterator。 然而,在编译时,我收到错误:error C2146:语法错误:标识符“iterator”之前缺少';'error C4430:缺少类型说明符 - 默认假定为int。注意:C++不支持默认int。 我还收到了警告:warning C4346:“std :: vector<T> :: iterator”:依赖名称不是类型
#include <vector>
template<class T> class v1{
    typedef std::vector<T>::iterator iterator; // Error here
};
class v2{
    typedef std::vector<int>::iterator iterator; // (This works)
};

我甚至尝试过

template<typename T> class v1{
    typedef std::vector<T>::iterator iterator;
};

并且
template<typename T = int> class v1{
    typedef std::vector<T>::iterator iterator;
};

1
clang++以其相当不错的错误信息而闻名,特别是对于这种类型的错误。在这种情况下,它说“error: missing 'typename' prior to dependent type name 'std::vector<T>::iterator'”。如果您无法理解另一个编译器的错误消息,我建议尝试使用clang(例如在在线编译器中)。 - dyp
@DyP GCC有类似的错误信息。 - Rapptz
@Rapptz 哦,确实对于这个例子来说是这样的 :) 好吧,这真是个惊喜。我最终在一段时间前从g++转换到clang++,因为错误消息变得难以阅读,尽管对于更复杂的情况如此。 - dyp
1个回答

34

std::vector<T>::iterator是一个相关名称,因此您需要在这里使用typename来指定它是引用类型。否则它将被视为非类型:

typedef typename std::vector<T>::iterator iterator;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接