C++ 在实现迭代器时声明值\u类型

C++ 在实现迭代器时声明值\u类型,c++,c++11,iterator,containers,C++,C++11,Iterator,Containers,我正在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; 在“struct std::iterator\u traits”中没有

我正在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;
在“struct std::iterator\u traits”中没有名为“value\u type”的类型
typedef typename迭代器_traits::value_type_ValueTypeO;
在回答之前,我在这里读过:

它说我可以:

  • specialize
    std::iterator\u traits
    :对于代码可读性,作者认为这不是首选方法,因为该类型声明未嵌套在类中
  • 将相同的typedef放入迭代器本身:我这样做了,但仍然存在上面的错误
  • Inherit from std::iterator:这会解决我的问题吗?使用此方法的正确方法是什么
这个互动器作为一个背面插入器工作。 当前类别定义为:

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); }
};
模板
皮克斯布弗类
{
公众:
友元类seq_read_迭代器;
/*容器类实现从此处删除*/
公众:
类seq_read_迭代器
{
公众:
类型定义T值_类型;
顺序读迭代器(PixBuffer&pb);
seq_read_迭代器和运算符*(T val);
seq_read_迭代器和运算符++();
seq_read_迭代器运算符++(int);
seq_read_迭代器和运算符=(T val);
/*迭代器类实现从此处删除*/
};
seq_read_迭代器seqReadIterator(){返回seq_read_迭代器(*this);}
};

提前感谢

所有3种让迭代器工作的方法都是合法的

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

当您已经有一个不一致的迭代器时,通常使用std::iterator\u traits,您不能更改该迭代器的代码


您的代码不起作用,因为您没有添加所有5个必需的类型别名。在C++11之前,它只会爆炸并抱怨它不能实例化迭代器特性。现在它只创建空的trait类:

如果
Iterator
没有五种成员类型
difference\u type
value\u type
指针
reference
Iterator\u category
,则此模板没有成员类型(
std::Iterator\u traits
是SFINAE友好的)


所有3种让迭代器工作的方法都是合法的

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

当您已经有一个不一致的迭代器时,通常使用std::iterator\u traits,您不能更改该迭代器的代码


您的代码不起作用,因为您没有添加所有5个必需的类型别名。在C++11之前,它只会爆炸并抱怨它不能实例化迭代器特性。现在它只创建空的trait类:

如果
Iterator
没有五种成员类型
difference\u type
value\u type
指针
reference
Iterator\u category
,则此模板没有成员类型(
std::Iterator\u traits
是SFINAE友好的)


“将相同的typedef放入迭代器本身:我这样做了,但仍然存在上面的错误”。看来你做得不对。展示相关部分,我们可能会有所帮助。关于“我认为这是标准禁止的”:
[namespace.std]/1
“仅当声明取决于用户定义的类型且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间
std
。“@Revolver\u Ocelot:代码added@TartanLlama:你说得对,这是有效的。不过,如果可能的话,我更喜欢另一种更好的代码组织方法。目前的趋势似乎是选项2,将typedef添加到迭代器中。这就是标准文档在以后的草稿中所做的:“将相同的typedef放入迭代器本身:我这样做了,但仍然存在上面的错误”。看来你做得不对。展示相关部分,我们可能会有所帮助。关于“我认为这是标准禁止的”:
[namespace.std]/1
“仅当声明取决于用户定义的类型且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间
std
。“@Revolver\u Ocelot:代码added@TartanLlama:你说得对,这是有效的。不过,如果可能的话,我更喜欢另一种更好的代码组织方法。目前的趋势似乎是选项2,将typedef添加到迭代器中。这就是标准文档在以后的草稿中所做的。谢谢!gcc错误消息很容易引起误解,谢谢!那么gcc错误消息是相当误导的