当容器定义为const时,具有自定义迭代器的自定义容器不起作用

时间:2011-01-15 15:07:30

标签: c++ templates iterator metaprogramming


或多或少的一切都在主题中 当我有

func(my_cont& c)
{ c.begin() };

事情有效,但

func(const my_cont& c)
{ c.begin() };

不起作用,编译器声称无法将此转换为const my_cont< ..> ....来自my_cont< ..>

容器和我的自定义迭代器有什么要求来处理它?<​​/ p>

5 个答案:

答案 0 :(得分:4)

你的容器类应该有两个begin()和end()实现 - 一个返回迭代器,另一个返回const_iterator:

      iterator begin ();
const_iterator begin () const;
      iterator end ();
const_iterator end () const;

const_iterator不能用于修改它指向的对象。

答案 1 :(得分:1)

您需要添加一个const begin(),如下所示:

class my_cont
{
public:
    const_iterator begin() const;
};

您还必须定义const_iterator类型。

答案 2 :(得分:1)

这是一篇关于编写迭代器的好文章:
http://www.aristeia.com/Papers/CUJ_June_2001.pdf

正如大多数人所说,你需要一个const版本的begin()和end()来返回一个const_iterator。

大多数人都忘记了迭代器应该能够隐式转换为const_iterator。否则很难从非成本对象中获取const迭代器(没有很多讨厌的强制转换)。

 my_cont   data;
 for(my_cont::const_iterator loop = data.begin(); loop != data.end(); ++loop)
 {
     /* STUFF */
 }

上面的注意:以上调用实际上会调用非成本版本begin()和end()。但是它们被分配给const_iterator。所以你的迭代器必须可以转换为const_iterator才能使上面的代码工作(注意:没有从const_iterator到迭代器的隐式转换。这应该采用一个显式的const_cast,因为它本身就很危险)。

class my_cont
{
    public:
    class iterator { /* STUFF */ }
    class const_iterator
    {
        public: const_iterator(iterator const& rhs);
        /* STUFF */
    }

    iterator       begin();
    iterator       end();

    const_iterator begin() const;
    const_iterator end()   const;
    /* STUFF*/ 
};

答案 3 :(得分:0)

这正是STL为容器实现cost_iterator的原因。只需检查它在STL中是如何实现的,我不确定你能找到更好的解决方案。

答案 4 :(得分:0)

您只能在const对象上调用const成员函数(或者在volatile对象上调用volatile成员函数)。 编译器告诉iterator my_cont::begin() const缺失。