在实现迭代器时声明 value_type

Declaring the value_type when implementing an iterator

我正在用 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?

它说我可以:

此交互器用作 back_inserter。 当前的 class 定义是:

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); }
};

提前致谢

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

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

Specializing std::iterator_traits 通常用于,当你已经有一个 non-conforming 迭代器时,你不能改变它的代码。


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

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

If Iterator does not have the five member types difference_type, value_type, pointer, reference, and iterator_category, then this template has no member types (std::iterator_traits is SFINAE-friendly)