Seltsamer Compiler-Fehler beim Operatoroverloading



  • Hallo zusammen,

    ich habe mir eine Klasse TSong geschrieben, die Informationen über Lieder verwaltet (Titel, Künstler usw.).

    Eine zweite Klasse implementiert einen vector<TSong> und soll diesen über std::sort sortieren können. Deshalb habe ich für TSong den operator< geschrieben:

    class TSong
    {
    //...
    public
        friend bool operator <(const TSong &left, const TSong &right);
    //...
    };
    
    bool operator <(const TSong &left, const TSong &right)
    {
        return (left.FArtist < right.FArtist) || (left.FArtist == right.FArtist && left.FTitle < right.FTitle);
    }
    

    So weit so gut.

    Sobald ich jetzt sort aufrufe, gibt der Compiler (C++-Builder 6) mir folgende Fehlermeldungen:

    [C++ Fehler] _heap.h(82): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algo.c(762): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algobase.h(69): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algobase.h(70): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algobase.h(183): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _heap.c(149): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _heap.c(154): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algo.c(748): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
      [C++ Fehler] _algo.c(752): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
    

    Ohne sort bzw. bei einem sort über einen vector<int> gibt es keine Probleme.

    Woran kann das liegen?

    Edit: Der sort-Aufrus sieht so aus:

    using namespace std;
    //...
    sort(FSongs.begin(), FSongs.end());
    //...
    


  • hmmm könnte es an dem const liegen?



  • Wenn ich anstelle von konstanten Referenzen normale Objekte übergebe, passiert dasselbe.



  • Also an deinem geposteten Code liegts vermutlich nicht, kann zumindest erstmal keinen Fehler entdecken.
    Wenn ich den Compilerfehler richtig interpretiere, beschwert er sich über Defaultwerte bei einer Operator Deklaration/Definition. Du solltest das an betreffenden Stellen mal prüfen.



  • Hab ich mir auch gedacht und deshalb mal alle anderen Operatoren auskommentiert. Ohne Erfolg.

    ist das vielleicht ein Compilerbug?



  • Eßer schrieb:

    ist das vielleicht ein Compilerbug?

    Nein.

    Was für Fehler hast du denn jetzt? Poste einfach mal betreffende Zeile des ersten Fehlers.



  • Der Fehler ist in irgendeiner internen Header-Datei:

    //Auszug aus _heap.h:
    template <class _RandomAccessIterator, class _Tp, class _Compare, 
              class _Distance>
    inline void 
    __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
               _RandomAccessIterator __result, _Tp __value, _Compare __comp,
               _Distance*)
    {
      *__result = *__first; //<- Das ist die Zeile mit der Fehlermeldung
      __adjust_heap(__first, _Distance(0), _Distance(__last - __first), 
                    __value, __comp);
    }
    

    Die anderen sehen ähnlich aus.

    Das muss irgendwas mit der Operator-Deklaration zu tun haben, oder? Wie gesagt, bei einem vector<int> läuft es. Oder kann es sein, dass ich den Zuweisungsoperator explizit implementieren muss, weil ich in meiner Klasse TSong Borland-properties benutze?



  • Sorry, hab den Fehler gefunden.

    Der Zuweisungsoperator hat mich drauf gebracht. Den hatte ich vergessen, obwohl ich noch nen Zeiger in meiner Klasse hatte.

    Danke für eure Mühe!


Anmelden zum Antworten