C ++ 11将迭代器用于模板参数类型的向量

时间:2016-01-22 07:53:35

标签: c++ templates c++11 vector

我有一个模板类,其中包含一个指定为模板参数的指针向量。我希望能够使用基于范围的迭代来迭代向量的有限部分。我的类包含以下函数:

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}的行,则该类的其余部分会成功实例化}。

任何人都知道发生了什么事?我敢肯定,我可能会遗漏一些明显的东西。提前谢谢!

3 个答案:

答案 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。

相关问题