我正在为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?
它声明我可以:
std::iterator_traits<youriterator>
:对于代码可读性,这不是根据作者的首选方法,因为此类型声明未嵌套在类中此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); }
};
提前致谢
答案 0 :(得分:2)
所有3种使迭代器工作的方法都是合法的。
首选方法是向类本身添加必需的类型别名。继承std::iterator
只是一种快速的方法。
当你已经有一个不符合要求的迭代器时,通常会使用专门的std::iterator_traits
,这段代码是你无法改变的。
您的代码不起作用,因为您没有添加所有5个必需的类型别名。在C ++ 11之前,它只会爆炸并抱怨它无法实例化iterator_traits
。现在它只创建空特质类:
http://en.cppreference.com/w/cpp/iterator/iterator_traits
如果
Iterator
没有五种成员类型difference_type
,value_type
,pointer
,reference
和iterator_category
,那么此模板没有会员类型(std::iterator_traits
是SFINAE友好的)