Problem mit erase bei STL



  • Hallo!

    Habe eine Frage zur STL! Erstmal mein Code:
    Ich habe eine ziemlich komplexe Klasse muster, anbei nur ein Teilausschnitt

    class 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. Mit

    vector<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?


Anmelden zum Antworten