У меня есть класс, который включает в себя std :: list и хочу предоставить public begin () и end () для const_iterator, а private begin () и end () для простого итератора.
Однако компилятор просматривает приватную версию и жалуется, что она приватная, а не использует публичную версию const.
Я понимаю, что C ++ не будет перегружаться при возвращаемом типе (в данном случае const_iterator и iterator), и поэтому он выбирает неконстантную версию, поскольку мой объект не является const.
Если не приводить мой объект к const перед вызовом begin () или не перегружать имя 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
Спасибо.
-William