Fehlermeldung vom C++-Compiler, mit der ich nicht klarkomme
-
Hallo,
es geht mal wieder um meine Klasse für Vierervektoren.
Also, ich habe zwei Dateien FourVector.h (mit den Deklarationen) und FourVector.cpp (mit den Implementationen) und versuche erstmal nur die Objektdatei von FourVector.cpp (mit FourVector.h klappt es) zu erzeugen mittels des Befehlsc++ -c FourVector.cpp
In der Überladung des Additionsoperators moechte ich einen FourVector zurückgeben
FourVector FourVector::operator+(FourVector & v1){ return FourVector(array[0]+v1.array[0], array[1]+v1.array[1], array[2]+v1.array[2], array[3]+v1.array[3]); }Der C++-Compiler behauptet nun dreist, er würde einen FourVector übergeben bekommen,
FourVector.cpp: In member function »FourVector FourVector::operator+(FourVector&)«:
FourVector.cpp:82: Fehler: keine passende Funktion für Aufruf von »FourVector::FourVector(FourVector)«
FourVector.cpp:34: Anmerkung: Kandidaten sind: FourVector::FourVector(double*)
FourVector.cpp:16: Anmerkung: FourVector::FourVector(FourVector&)aber wie kann das denn sein? Jedes der Argumente ist doch ein double-Value.
Hier ist übrigens der Konstruktor, der die double-Werte entgegen nimmt:FourVector::FourVector(double v1, double v2, double v3, double v4){ array[0]=v1; array[1]=v2; array[2]=v3; array[3]=v4; }Ach ja, die Klasse sieht übrigens so aus
class FourVector{ // per Standard ist 'private' der access-specifier double array[4]; public: // ein paar Konstruktoren FourVector(); FourVector(FourVector& c); FourVector(double v1, double v2, double v3, double v4); FourVector(double vektor[]); // ein paar Ueberladungen von Operatoren double& operator[](const int & index); FourVector& operator=(const FourVector &s); FourVector operator+(FourVector & v1); //FourVector operator-(const FourVector & v1); double operator*(FourVector& v1); int operator==(FourVector& v1); // spezielle Funktionen [bla]Was mache ich falsch?

-
Dein Operator gibt eine Kopie zurück, die aus einem temporären Objekt erstellt wird. Dein Copy-Konstruktor akzeptiert aber nur eine non-const-Referenz, und an die kann ein temporäres Objekt nicht gebunden werden.
-
Danke nochmal für die Antwort (die Klasse kompiliert jetzt und funktioniert weitgehend auch ganz gut). Ich habe nochmal eine kleine Frage. Und zwar hab ich einen Multiplikationsoperator definiert
FourVector operator*(const double v, FourVector& vektor){ [...]der als linkes Argument ein double Wert annimmt. Muss ich die gleiche Menge an Codezeilen verwenden (also Deklaration und Definition nur mit vertauschten Argumenten), wenn ich jetzt möchte, dass der double-Wert auch als rechtes Argument in irgendeinem Programmcode stehen kann, wie z.B. hier
cout << v1*(v1*(v1+v2)) << endl;oder gibt es da einen shortcut?

-
Mach's doch einfach so:
FourVector operator*(FourVector& vektor, const double v){ FourVector result = v * vektor; return result; }Du solltest dir übrigens angewöhnen, die Referenzparameter const zu machen, wo es angebracht ist. Dein Operator kann beispielsweise keinen const FourVector multiplizieren.