或多或少的一切都在主题中
当我有
func(my_cont& c)
{ c.begin() };
事情有效,但
func(const my_cont& c)
{ c.begin() };
不起作用,编译器声称无法将此转换为const my_cont< ..> ....来自my_cont< ..>
容器和我的自定义迭代器有什么要求来处理它?</ p>
答案 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
缺失。