在实现迭代器时声明 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?
它说我可以:
- specialize
std::iterator_traits<youriterator>
:根据作者的说法,为了代码可读性,这不是首选方法,因为此类型声明未嵌套在 class 中
- 将相同的 typedef 放入迭代器本身:我这样做了,但我仍然有上面的错误
- 继承自 std::iterator:这会解决我的问题吗?使用此方法的正确方法是什么?
此交互器用作 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)
我正在用 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>
:根据作者的说法,为了代码可读性,这不是首选方法,因为此类型声明未嵌套在 class 中
- 将相同的 typedef 放入迭代器本身:我这样做了,但我仍然有上面的错误
- 继承自 std::iterator:这会解决我的问题吗?使用此方法的正确方法是什么?
此交互器用作 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 typesdifference_type
,value_type
,pointer
,reference
, anditerator_category
, then this template has no member types (std::iterator_traits
is SFINAE-friendly)