op<< für Ausgabe und STL-Container
-
Ich erklärs mal an Hand eines Beispiels:
class A { public: typedef std::deque<int> container_type; typedef container_type::iterator iterator; friend ostream& operator << (ostream& stream, const A& data); private: std::deque<int> m_container; }; ostream& operator << (ostream& stream, const A& data) { A::iterator runner = data.m_container.begin(); // Can't convert const_iterator into iterator while(runner != data.m_container.end()) { cout << *runner; ++runner; // endlosschleife rauseditiert } return(stream); }
Was tun? Okay, vielleicht ist deque nicht das beste Beispiel weils notfalls auch noch über den []-Operator ansprechbar ist. Aber das kann doch nicht sein, dass ich ein konstantes Objekt nicht ausgeben darf nur weil sich der STL-Container wehrt sich iterieren zu lassen...
MfG SideWinder
-
Nicht einmal ein const_cast funktioniert in diesem Fall - kA wieso.
MfG SideWinder
-
folgendes funktioniert bei mir
class A { public: typedef std::deque<int> container_type; typedef container_type::const_iterator iterator; //hier const_iterator friend ostream& operator << (ostream& stream, const A& data); void add (int i) {m_container.push_back (i);} private: std::deque<int> m_container; }; ostream& operator << (ostream& stream, const A& data) { A::iterator runner = data.m_container.begin(); // while(runner != data.m_container.end()) { cout << *runner++; // da hattest du ne Endlosschleife *g* } return(stream); } int main () { A foo; foo.add (7); cout << foo; }
Ich habe auch mal etwas rumgetestet, und habe folgendes hinbekommen
class A { public: typedef std::deque<int> container_type; typedef container_type::iterator iterator; friend ostream& operator << (ostream& stream, const A& data); void add (int i) {m_container.push_back (i);} private: std::deque<int> m_container; }; ostream& operator << (ostream& stream, const A& data) { std::deque<int>::iterator runner = const_cast<A&>(data).m_container.begin(); // So geht es while(runner != data.m_container.end()) { cout << *runner++; } return(stream); } int main () { A foo; foo.add (7); cout << foo; }
-
Hat sich schon erledigt, wenn ein const_iterator auch brav durch die Liste wandern kann ist das ja gut so. Dachte schon der ist dazu nicht im Stande, aber dann wär er ja sinnlos - Denkfehler also
BTW: Den bösen const_cast können wir uns dann auch sparen
MfG SideWinder