【问题标题】:Declaring the value_type when implementing an iterator实现迭代器时声明 value_type
【发布时间】:2016-04-28 21:39:38
【问题描述】:

我正在 c++11 中为自定义容器实现迭代器

我收到以下错误:

no type named 'value_type' in 'struct std::iterator_traits<PixBuffer<float>::seq_read_iterator>'
    typedef typename iterator_traits<_OI>::value_type _ValueTypeO;

我在此处的答案之前已阅读: How to implement an STL-style iterator and avoid common pitfalls?

它表明我可以:

  • specialize std::iterator_traits&lt;youriterator&gt; :这不是作者的首选方法,为了代码可读性,因为这种类型声明没有嵌套在类中
  • 将相同的 typedefs 放入迭代器本身:我这样做了,但仍然出现上述错误
  • 从 std::iterator 继承:这会解决我的问题吗?使用此方法的正确方法是什么?

此插入器用作 back_inserter。 当前的类定义是:

template<typename T>
class PixBuffer
{
public:
    friend class seq_read_iterator;

    /* container class implementation removed from here */

public:
    class seq_read_iterator
    {
    public:
        typedef T value_type;

        seq_read_iterator(PixBuffer & pb);
        seq_read_iterator & operator*(T val);
        seq_read_iterator & operator++();
        seq_read_iterator operator++(int);
        seq_read_iterator & operator=(T val);

        /* iterator class implementation removed from here */
    };


    seq_read_iterator seqReadIterator() { return seq_read_iterator(*this); }
};

提前致谢

【问题讨论】:

  • "将相同的 typedefs 放入迭代器本身:我这样做了,但我仍然有上面的错误"。好像你做错了。显示相关部分,也许我们可以提供帮助。
  • 关于“我认为这是标准禁止的”:[namespace.std]/1“只有当声明依赖于用户时,程序才能将任何标准库模板的模板特化添加到命名空间std -定义的类型和特化符合原始模板的标准库要求,并且没有明确禁止。”
  • @Revolver_Ocelot : 添加代码
  • @TartanLlama :你是对的,这是有效的。不过,如果可能的话,我更喜欢另一种方法来更好地组织代码。
  • 目前的趋势似乎是选项2,将typedefs添加到迭代器中。这就是标准文档在以后的草稿中所做的。

标签: c++ c++11 iterator containers


【解决方案1】:

所有 3 种已发布的使迭代器工作的方法都是合法的。

首选方法是向类本身添加所需的类型别名。从std::iterator 继承只是一种快速的方法。

专门化std::iterator_traits 通常使用,当你已经有一个不合格的迭代器,你不能改变它的代码。


您的代码不起作用,因为您没有添加所有 5 个必需的类型别名。在 C++11 之前,它只会爆炸并抱怨它无法实例化 iterator_traits。现在它只是创建了空的 trait 类:

http://en.cppreference.com/w/cpp/iterator/iterator_traits

如果Iterator 没有difference_typevalue_typepointerreferenceiterator_category 这五种成员类型,则此模板没有成员类型(std::iterator_traits 是 SFINAE 友好的)

【讨论】:

  • 谢谢!那么 gcc 错误消息非常具有误导性
猜你喜欢
  • 1970-01-01
  • 2016-01-11
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多