【发布时间】:2016-04-28 21:39:38
【问题描述】:
我正在 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>:这不是作者的首选方法,为了代码可读性,因为这种类型声明没有嵌套在类中 - 将相同的 typedefs 放入迭代器本身:我这样做了,但仍然出现上述错误
- 从 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); }
};
提前致谢
【问题讨论】:
-
"将相同的 typedefs 放入迭代器本身:我这样做了,但我仍然有上面的错误"。好像你做错了。显示相关部分,也许我们可以提供帮助。
-
关于“我认为这是标准禁止的”:
[namespace.std]/1“只有当声明依赖于用户时,程序才能将任何标准库模板的模板特化添加到命名空间std-定义的类型和特化符合原始模板的标准库要求,并且没有明确禁止。” -
@Revolver_Ocelot : 添加代码
-
@TartanLlama :你是对的,这是有效的。不过,如果可能的话,我更喜欢另一种方法来更好地组织代码。
-
目前的趋势似乎是选项2,将typedefs添加到迭代器中。这就是标准文档在以后的草稿中所做的。
标签: c++ c++11 iterator containers