Wil*_*mKF 7 c++ iterator stl overloading const
我有一个包含std :: list的类,并希望为const_iterator提供public begin()和end(),为plain iterator提供private begin()和end().
但是,编译器看到私有版本并抱怨它是私有的而不是使用公共const版本.
我知道C++不会在返回类型(在本例中为const_iterator和iterator)上重载,因此它选择非const版本,因为我的对象不是const.
如果没有在调用begin()之前将我的对象转换为const,或者没有重载名称,那么有没有办法实现这一点?
我认为这是人们之前已经解决过的一种已知模式,并且希望如何解决这个问题.
class myObject {
public:
void doSomethingConst() const;
};
class myContainer {
public:
typedef std::list<myObject>::const_iterator const_iterator;
private:
typedef std::list<myObject>::iterator iterator;
public:
const_iterator begin() const { return _data.begin(); }
const_iterator end() const { return _data.end(); }
void reorder();
private:
iterator begin() { return _data.begin(); }
iterator end() { return _data.end(); }
private:
std::list<myObject> _data;
};
void myFunction(myContainer &container) {
myContainer::const_iterator itr = container.begin();
myContainer::const_iterator endItr = container.end();
for (; itr != endItr; ++itr) {
const myObject &item = *itr;
item.doSomethingConst();
}
container.reorder(); // Do something non-const on container itself.
}
Run Code Online (Sandbox Code Playgroud)
编译器的错误是这样的:
../../src/example.h:447: error: `std::_List_iterator<myObject> myContainer::begin()' is private
caller.cpp:2393: error: within this context
../../src/example.h:450: error: `std::_List_iterator<myObject> myContainer::end()' is private
caller.cpp:2394: error: within this context
Run Code Online (Sandbox Code Playgroud)
谢谢.
-威廉
从std :: list派生的坏主意(它不是设计为派生自的).
使用std :: list类型的成员变量.
class myContainer
{
std::list<myObject> m_data;
public:
typedef std::list<myObject>::const_iterator myContainer::const_iterator;
private:
typedef std::list<myObject>::iterator myContainer::iterator;
public:
myContainer::const_iterator begin() const
{
return m_data.begin();
}
myContainer::const_iterator end() const
{
return m_data.end();
}
private:
myContainer::iterator begin()
{
return m_data.begin();
}
myContainer::iterator end()
{
return m_data.end();
}
};
Run Code Online (Sandbox Code Playgroud)
我认为你唯一的选择是重命名私有方法(如果你首先需要它们)。
另外我相信你应该重命名 typedef:
class MyContainer
{
public:
typedef std::list<Object>::const_iterator iterator;
typedef iterator const_iterator;
const_iterator begin() const;
const_iterator end() const;
private:
typedef std::list<Object>::iterator _iterator;
_iterator _begin();
_iterator _end();
...
};
Run Code Online (Sandbox Code Playgroud)
容器应该同时定义iterator和const_iterator。接受容器的非常量实例的通用函数可能期望使用 typedef iterator- 即使它不会修改元素。(例如BOOST_FOREACH。)
就 const 正确性而言,这没什么问题,因为如果泛型函数实际上尝试修改对象,则真正的迭代器类型(作为 a const_iterator)不会允许这样做。
作为测试,以下内容应与您的容器一起编译:
int main()
{
myContainer m;
BOOST_FOREACH(const myObject& o, m)
{}
}
Run Code Online (Sandbox Code Playgroud)
请注意,m 不是 const,但我们只是尝试获取对所包含类型的 const 引用,因此应该允许这样做。
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |