【发布时间】:2010-03-13 18:26:26
【问题描述】:
我有一个包含 std::list 的类,并希望为 const_iterator 提供 public begin() 和 end(),为普通迭代器提供 private begin() 和 end()。
但是,编译器看到私有版本并抱怨它是私有的,而不是使用公共 const 版本。
我知道 C++ 不会重载返回类型(在本例中为 const_iterator 和迭代器),因此它选择非 const 版本,因为我的对象不是 const。
在调用 begin() 之前将我的对象转换为 const 或不重载名称 begin 有没有办法做到这一点?
我认为这是人们以前解决过的已知模式,并且想效仿如何解决这个问题。
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.
}
编译器的错误是这样的:
../../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
谢谢。
-威廉
【问题讨论】:
-
据我所知,您的代码中没有继承,可能您应该更正“我正在私下派生一个类”。
-
糟糕,编辑不同步,感谢您指出,现在已更正。
-
如果你的非常量 begin & end 对你的容器来说是私有的,你为什么要为它们提供私有函数呢?为什么不直接使用列表迭代器。
-
Arak,一个原因是如果 begin()/end() 被保护,而成员变量保持私有。
标签: c++ stl iterator constants overloading