我有一个模板类,其中包含一个指定为模板参数的指针向量。我希望能够使用基于范围的迭代来迭代向量的有限部分。我的类包含以下函数:
template< typename ObjectType >
class ObjectList
{
...
public:
//! Begin iteration over a list of objects
std::vector<ObjectType*>::iterator begin();
//! Iterator to one past the end of the list of objects
std::vector<ObjectType*>::iterator end();
private:
std::vector<ObjectType*> object_ptrs;
};
无法使用说明Error C2061 syntax error: identifier 'iterator'
进行编译。我想不出为什么找不到std::vector<ObjectType>::iterator
的原因,除非找不到ObjectType
本身,但如果我删除引用{{1}的行,则该类的其余部分会成功实例化}。
任何人都知道发生了什么事?我敢肯定,我可能会遗漏一些明显的东西。提前谢谢!
答案 0 :(得分:1)
您需要告诉编译器迭代器是一种类型,因为它取决于模板参数:
template< typename ObjectType >
class ObjectList
{
public:
//! Begin iteration over a list of objects
typename std::vector<ObjectType*>::iterator begin();
//! Iterator to one past the end of the list of objects
typename std::vector<ObjectType*>::iterator end();
private:
std::vector<ObjectType*> object_ptrs;
};
答案 1 :(得分:1)
只要iterator
是类型或静态成员,编译器就不知道。您必须在函数返回类型之前添加typename
,以帮助编译器消除歧义:
typename std::vector<ObjectType*>::iterator begin();
此外,新g ++(至少从5.3.0开始)会产生更多可读错误消息:
main.cpp:11:5:错误:之前需要
typename
std::vector<ObjectType*>::iterator
因为std::vector<ObjectType*>
是一个依赖范围std::vector<ObjectType*>::iterator begin()
答案 2 :(得分:1)
您应该在此使用typename
,因为std::vector<ObjectType*>
是依赖类型名称,取决于模板参数ObjectType
。
typename std::vector<ObjectType*>::iterator begin();
typename std::vector<ObjectType*>::iterator end();
$ 14.6 / 2名称解析[temp.res]
模板声明或定义中使用的名称,即 取决于模板参数,假定不命名类型,除非 适用的名称查找查找类型名称或名称是合格的 通过关键字typename。