在实现迭代器时声明value_type

时间:2016-01-22 10:15:44

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

我正在为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<youriterator>:对于代码可读性,这不是根据作者的首选方法,因为此类型声明未嵌套在类中
  • 在迭代器本身中放入相同的typedef:我这样做但我仍然有上面的错误
  • 继承自std :: iterator:这会解决我的问题,使用此方法的正确方法是什么?

此interator用作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); }
};

提前致谢

1 个答案:

答案 0 :(得分:2)

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

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

当你已经有一个不符合要求的迭代器时,通常会使用专门的std::iterator_traits,这段代码是你无法改变的。

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

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

  

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