gpt4 book ai didi

c++ - 实现迭代器时声明 value_type

转载 作者:行者123 更新时间:2023-11-28 02:13:16 27 4
gpt4 key购买 nike

我正在用 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> : 根据作者的说法,为了代码的可读性,这不是首选方法,因为此类型声明未嵌套在类中
  • 将相同的 typedef 放入迭代器本身:我这样做了,但我仍然有上面的错误
  • 从 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); }
};

提前致谢

最佳答案

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

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

专门化 std::iterator_traits 通常用于当您已经有一个不符合要求的迭代器时,您无法更改其代码。


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

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++ - 实现迭代器时声明 value_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com