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 Befehls

    c++ -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.


Anmelden zum Antworten