Ho una classe che include un elenco std :: e desidero fornire public begin() e end() per const_iterator e private begin() e end() per un semplice iteratore.Come fornire un contenitore di tipo STL con iteratore const pubblico e iteratore privato non const?
Tuttavia, il compilatore sta visualizzando la versione privata e si lamenta che è privato anziché utilizzare la versione pubblica const.
Capisco che C++ non sovraccaricherà sul tipo restituito (in questo caso const_iterator e iterator) e quindi sta scegliendo la versione non-const poiché il mio oggetto non è const.
In mancanza di trasmettere il mio oggetto a const prima di chiamare begin() o non sovraccaricare il nome begin esiste un modo per ottenere ciò?
Penso che questo sia un modello noto che le persone hanno risolto prima e vorrebbe seguire l'esempio di come questo è in genere risolto.
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.
}
L'errore del compilatore è qualcosa di simile:
../../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
Grazie.
-William
Per quanto vedo, non vi è alcuna ereditarietà nel codice, probabilmente è necessario correggere "Sto generando una classe privatamente". –
Oops, le modifiche non erano sincronizzate, grazie per averlo indicato, ora è stato corretto. – WilliamKF
Se il tuo inizio e fine non const sono privati del tuo contenitore, perché vuoi fornire funzioni private per loro? Perché non usare semplicemente gli iteratori di lista direttamente. – AraK