Problem mit erase bei STL
-
Hallo!
Habe eine Frage zur STL! Erstmal mein Code:
Ich habe eine ziemlich komplexe Klasse muster, anbei nur ein Teilausschnittclass muster { private: AnsiString Identnr; AnsiString Name; // weitere Elemente anderer Datentypen unter anderem weitere Klassen public: // Properties // Methoden... };
In meinem "Hauptprogramm" mache in einen Vektor-Container und einen Iterator und befülle den Conrainer in der for-Schleife
vector<muster> musterliste; vector<muster>::iterator IterMuster; muster Winkelbau; for(....) { Winkelbau.Set... //usw. }
Nach Gebrauch soll der Container wieder komplett geleert werden. Dies will ich folgendermaßen machen:
musterliste.erase();
Aber leider will der Compiler mir dies nicht so übersetzen, das ganze Programm klappt, bis auf das Löschen des Containers, da bringt er mir folgenden Fehler:
E2285 Keine Übereinstimmung für 'vector<muster,allocator<muster> >::erase()' gefunden
Ich würde mich freuen, wenn mir einer bei diesem Problem hilft. Evtl. fehlt ja auch nur eine Bibliothek o.ä.????
Vielen Dank, Jannika
-
Hallo,
musterliste.clear() löscht alle Elemente des Vektors. Danach ist size() == 0. Mitvector<muster>().swap(musterliste);
kannst du zusätzlich die Kapazität des Vektors auf ein Minimum reduzieren.
-
Entweder rufst du
musterliste.erase(musterliste.begin(), musterliste.end());
auf oder noch besser
musterliste.clear()
Beides bewirkt das gleiche.
MfG
-
Fehlt da nicht ein übergabeparameter für erase ?
Wenn du alle elemente löschen willst, kannst du auch clear verwenden.Edit: Da wahr wohl jemand schneller
Devil
-
godlikebot schrieb:
musterliste.erase(musterliste.begin(), musterliste.end());
musterliste.clear()
Bei beiden Versuchen kommt:
[C++ Fehler] _algobase.h(145): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
Ich weiß nicht mehr was ich nich versuchen soll, hatte das nämlich vorher auch schon getestet!!
-
Hm, welchen Compiler verwendest du ?
Und welche STL Version ?
-
Ich arbeite mit dem Borland Builder 6! Hab noch nie was von STL-Versionen gehört,
wo kann ich denn rausfinden welche ich verwende???
-
Jannika schrieb:
Ich arbeite mit dem Borland Builder 6! Hab noch nie was von STL-Versionen gehört,
wo kann ich denn rausfinden welche ich verwende???
Das ist i.d.R. Compiler abhängig, wenn du noch nie was davon gehört hast,
verwendest du wohl die von Borland mit gegebene Implementierung.
-
Jannika schrieb:
godlikebot schrieb:
musterliste.erase(musterliste.begin(), musterliste.end());
musterliste.clear()
Bei beiden Versuchen kommt:
[C++ Fehler] _algobase.h(145): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
Ich weiß nicht mehr was ich nich versuchen soll, hatte das nämlich vorher auch schon getestet!!
Also, dein Fehler E2328 heisst in der englischen Version: "Classes with properties cannot be copied by value". Komische Übersetzung o.O ...
Ich selber benutze den Borland Compiler nicht, aber wenn ich mich richtig erinnere (Achtung, Halbwissen:), dann bietet der teilweise Implementierungen und "Möglichkeiten", die nicht ganz Standard-Konform sind. Kann aber auch sein, dass ich mich irre, dann zerreisst mich bitte nicht.
Du könntest versuchen den Code in
musterliste.erase(&musterliste.begin(), &musterliste.end());
zu ändern (bin mir da aber auch nicht sicher) oder du schreibst bei der Deklaration von "musterliste":
std::vector<muster> musterliste;
Aber das sind alles nur Vermutungen...
-
Soviel ich weis, verwendet der BCB6 in der Standardkonfiguration die stlport.
-
Hallo!
Also, jetzt habe ich auch mal die neuen Versuche ausprobiert, aber es hilft nichts! Bei einer näheren Beschreibung des Problems steht:
E2328 Klassen mit Eigenschaften dürfen nicht über ihren Wert kopiert werden Dieser Fehler tritt auf, wenn Sie versuchen, den Standardzuweisungoperator zu verwenden.
template <class _RandomAccessIter, class _OutputIter, class _Distance> inline _OutputIter __copy(_RandomAccessIter __first, _RandomAccessIter __last, _OutputIter __result, const random_access_iterator_tag &, _Distance*) { for (_Distance __n = __last - __first; __n > 0; --__n) { :arrow: *__result = *__first; ++__first; ++__result; } return __result; }
Der Fehler tritt bei dieser Zeile auf! Hat jemand eine Ahnung wie ich aus diesem Problem rauskomme?