[solved] Problem bei Operatorüberladung
-
Hallo,
beim Schreiben eines Programmes bin ich auf ein Problem gestoßen.
Ich habe eine Klasse, deren Instanzen ich addieren möchte.Nun habe ich den Code für den Additions- und Zuweisungsoperator sowie für den Kopierkonstruktor geschrieben.
Die Addition alleine funktioniert, die Zuweisung auch.
Wenn ich jetzt allerdings das Ergebnis der Addition einem 3. Objekt zuweisen möchte, stellt sich der Compiler quer.Den Code habe ich hierhin gepastet.
Die Fehlermeldung lautet
main.cpp: In function ‘int main()’: main.cpp:7: error: no match for ‘operator=’ in ‘sum = Tour::operator+(Tour&)(((Tour&)(& t2)))’ Tour.h:19: note: candidates are: Tour& Tour::operator=(Tour&)Ich kann mit der Meldung nicht wirklich etwas anfangen.
Nur der Aufruf der Addition sieht für mich sehr merkwürdig aus.Kann mir jemand einen Tip geben, wo der Fehler liegt?
-
Temporäre Objekte (wie der Rückgabewert des operator+) können nicht an nicht konstante Referenzen gebunden werden. Schreib den operator= so um, dass er einen Tour const &-Parameter entgegennimmt.
Das wäre auch beim operator+ guter Stil, sonst kriegst du da spätestens bei a + b + c Probleme.
-
Ah, danke. Mit Referenz als Parameter funktioniert es. Man sollte halt nebenbei nicht mit Visual Studio / in Visual C++ programmieren, da scheint das kein Fehler zu sein...
-
seldon schrieb:
Temporäre Objekte (wie der Rückgabewert des operator+) können nicht an nicht konstante Referenzen gebunden werden.
Alleine schon weil es letztere nicht gibt :p
(Du meintest sicher Referenzen auf nicht-konstante Objekte, oder "Non-Const-Referenzen". Soll kein Vorwurf sein ;))andy89 schrieb:
Man sollte halt nebenbei nicht mit Visual Studio / in Visual C++ programmieren, da scheint das kein Fehler zu sein...
Oder man sollte vielleicht Compilerwarnungen lesen. Und falls nötig compilerspezifische Erweiterungen abschalten.
Übrigens solltest du
operator+nicht als Memberfunktion definieren. Einoperator+=wäre zudem auch praktisch. Warum, siehst du hier.
-
Nexus schrieb:
Übrigens solltest du
operator+nicht als Memberfunktion definieren. Einoperator+=wäre zudem auch praktisch. Warum, siehst du hier.Wenn ich Operator+ aber in der Form
const X operator+(X const& lhs, X const& rhs);überladen möchte, sagt mit g++
Fehler: »const Tour Tour::operator+(const Tour&, const Tour&)« muss entweder null oder ein Argument nehmeOder was meinst du mit ich sollte operator+ nicht als Memberfunktion implementieren?
Kann mich nur erinnern, dass ich irgendwo gelesen habe, die Operatorüberladung als Funktion zu schreiben und als friend in der Klasse anzugeben...
-
Deklariere den Operator nicht innerhalb der Klasse, sondern als freie Funktion.