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!