copy-Befehl für eigenen Container mit eigenem Iterator
-
Hey
Ich habe einen eigene doppelt verkettete Liste mit einem eignene Bidirektionalem Iterator implementiert. Es funktioniert auch alles wunderbar ich kann meine Liste durchgehen Elemente ausgeben etc. Nur bekomme ich wenn ich den Befehl copy(meineListe.begin(), meineListe.ende(), ostream_iterator<string> os(cout, "\n")) immer folgende Fehler:
error: no type named 'value_type'
error no type named 'iterator_category'
Ich hab schon alles versucht aber ich komm einfach nicht drauf was mir fehlt...Hier mein Code:
template<class T>class myList { private: item *anfang; item *ende; int anzahl; // Datentyp für ein Element der Liste: class item { private: T werte; // die Daten eines Elements item *next; // Verweis auf Nachfolger item *pre; public: ... }; //class item public: template<typename U> class biIta : iterator<bidirectional_iterator_tag, U> { private: item* e; public: biIta() { } biIta(item* n) { e = n; } void begin(){ e = anfang; } void end(){ e = ende; } item* getItem() { return e; } U& operator*() { return e->getDaten(); } void operator++() { if (e->getNext() == NULL) { cout << "Bereits am Ende der Liste" << endl; } else { e = e->getNext(); } } void operator--() { if (e->getPre() == NULL) { cout << "Bereits am anfang der Liste" << endl; } else { e = e->getPre(); } } bool operator==(biIta b) { if (e == b.e) { return true; } else { return false; } } bool operator!=(biIta b) { if (e != b.e) { return true; } else { return false; } } item* operator->() { return e; } }; //class BiIta typedef biIta bte; typedef T value_type; ... };//class myListKleiner Anhang:
Ich hab mal den Copy befehl so wie er implementiert ist, in meiner Main mal selbst gemacht und es funktioniert einwandfrei... Nur der vordefinierte copy will nicht
myList<string>::biIta<string> btBe = l.begin(); myList<string>::biIta<string> btEn = l.end(); ostream_iterator<string> os(cout, "\n"); // while(btBe != btEn){ *os = *btBe; *os; ++btBe; }
-
Erb mal public, wie sich das gehört.
-
WOW das war es tatsächlich -.-
Vielen Dank, ich sitz jetzt seit 3 Stunden dran und hab einfach nicht verstanden was falsch läuft...
-
Hast du einfach nicht gewusst, dass die Vererbung private ist, wenn man nichts angibt oder hast du nicht gewusst, dass public-Vererbung hier das richtige Mittel ist?
Du willst hier ausdrücken, dass dein Iterator ein bidirektionaler Operator ist. public-Vererbung drückt genau solche "ist ein"-Beziehungen aus. private-Vererbung drückt hingegen eher ein "ist umgesetzt mit Hilfe von" aus.
-
Nene ich hab schon gewusst das es eine public-Vererbung sein muss, nur hab ich gedacht das ich die auch so gemacht hab und hab deshalb nicht mehr daran gedacht das das der Ursprung für den Fehler sein könnte.