Probleme mit Überladen von dem operator+



  • Hallo an alle,
    programmiere für die Uni ein Programm in C++, das Vectoren addieren soll.
    Habe bereits den [] Operator überladen, damit man auf die Elemente von Vectoren zugreifen kann und sie verändern kann.
    Leider bekomme ich bei Überladen von dem operator+ folgende Fehler:

    Fehler 1 error C2804: Binärer Operator '+' hat zu viele Parameter
    Fehler 2 error C2333: 'Vector<T,dim>::operator +': Fehler in Funktionsdeklaration; Funktionstext wird übersprungen
    Fehler 3 error C2804: Binärer Operator '+' hat zu viele Parameter
    Fehler 4 error C2333: 'Vector<T,dim>::operator +': Fehler in Funktionsdeklaration; Funktionstext wird übersprungen

    Ich rufe den Operator so:

    Vector f, g, h;
    h.(f,g);
    

    Mein Code:

    void operator+ (Vector vecA, Vector vecB) {
    		 T zahl1, zahl2, zahl3;
    		 for(int i = 0; i < dim; i++) {
    		 zahl1 = vecA[i];
    		 zahl2 = vecB[i];
    		 zahl3 = zahl1 + zahl2;
    		 vector[i] = zahl3;
    		 }
    	}
    

    LG, Witness
    😉



  • Wenn der operator+ ein Member der Klasse ist, benötigt er nur einen Parameter.



  • Hallo Witness,

    Willkommen im C++-Forum.

    Ich vermute, Du hast bei der Deklaration des operator+ das Zauberwort friend vergessen und den Returntyp - also etwa so:

    template< typename T, std::size_t dim >
    class Vector
    {
    public:
        // ... irgendwelche Methoden
        friend Vector operator+( const Vector& vecA, const Vector& vecB ) {
            Vector vector; // das (spätere) Ergebnis
            // ähnlich wie unten
            return vector;
        }
        // usw.
    

    außerdem ist zu empfehlen diese Parameter als const Reference zu übergeben.

    Gruß
    Werner



  • @daddy_felix:

    also, ich habe grade eben noch so probiert

    Vector operator+(const Vector &vec)
      {
       Vector tmp(dim);
       for(size_t i=0;i<dim;++i) tmp[i]=(*this)[i]+vec[i];
       return tmp; 
      }
    

    mit dem Aufruf:

    h = g.operator+(f);
    

    er hat folgende Fehler geworfen:
    Fehler 1 error C2664: 'Vector<T,dim>::Vector(const Vector<T,dim> &)': Konvertierung des Parameters 1 von 'const int' in 'const Vector<T,dim> &' nicht möglich
    Fehler 2 error C2678: Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const Vector<T,dim>' akzeptiert (oder keine geeignete Konvertierung möglich)
    Fehler 3 error C2678: Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const Vector<T,dim>' akzeptiert (oder keine geeignete Konvertierung möglich)



  • @Werner Salomon:

    Habe auch so probiert:
    mit dem Aufruf:

    h = operator+(f, g);
    
    friend Vector operator+(const Vector& vecA, const Vector& vecB){
    	Vector v[dim];
    	for(int i = 0; i < dim; i++) {
    	v[i] = vecA[i] + vecB[i];
       }
    	return v;
       }
    

    So wirft er nur sieben Fehler:
    Fehler 1 error C2678: Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const Vector<T,dim>' akzeptiert (oder keine geeignete Konvertierung möglich)

    Fehler 2 error C2678: Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const Vector<T,dim>' akzeptiert (oder keine geeignete Konvertierung möglich)
    Fehler 3 error C2664: 'Vector<T,dim>::Vector(const Vector<T,dim> &)': Konvertierung des Parameters 1 von 'Vector<T,dim> [3]' in 'const Vector<T,dim> &' nicht möglich
    4 IntelliSense: Die Argumentliste für "Klassenvorlage "Vector"" fehlt.
    5 IntelliSense: Der Bezeichner ""dim"" ist nicht definiert.
    6 IntelliSense: Kein "[]"-Operator stimmt mit diesen Operanden überein.
    7 IntelliSense: Kein "[]"-Operator stimmt mit diesen Operanden überein.



  • #include <iostream>
    #include <string>
    using namespace std;
    
    template<class T, int dim>
    class Vector {
    public:
    	typedef size_t size_type;
    	T vector[dim];
    
    	Vector() {
    		for(int i = 0; i < dim;i++) {
    		vector[i] = 0;
    		}
    		}
    	T& operator[] (int i) {
    			return vector[i];
    	}
    
    	/*Vector operator+(const Vector &vec)
      {
       Vector tmp(dim);
       for(size_t i=0;i<dim;++i) tmp[i]=(*this)[i]+vec[i];
       return tmp; 
      }*/
    	friend Vector operator+(const Vector& vecA, const Vector& vecB){
    	Vector v[dim];
    	for(int i = 0; i < dim; i++) {
    	v[i] = vecA[i] + vecB[i];
       }
    	return v;
       }
    
    	int length() {
    		return dim;
    	 }
    
    	void print() {
    		cout << length(vector)<< endl;
    	}
    
    };
    
    void main() {
    	typedef Vector<float, 3> Vector;
    
    	Vector f, g, h;
    
    	for(int i = 0; i < 3;i++) {
    		cout << f[i] << " ";
    		}
    	cout << endl;
    		f[0] = 1.0f;
    		f[1] = 2.0f;
    		f[2] = 3.0f;
    	for(int i = 0; i < 3; i++) {
    		cout << f[i] << " ";
    	}
    	cout << endl;
    	g[0] = 3.0f;
    	g[1] = 2.0f;
    	g[2] = 1.0f;
    	for(int i = 0; i < 3; i++) {
    		cout << g[i] << " ";
    	}
    	cout << endl;
    	// Addition 
    	//h.operator+(f, g);
    	h = operator+(f, g);
    	/*for(int i = 0; i < 3; i++) {
    		cout << h[i] << " ";
    	}*/
    	cout << endl;
    
    }
    


  • friend Vector operator+(const Vector& vecA, const Vector& vecB)
    {
        Vector v; // <- keine Klammerung - keine Dimension angeben
        for(int i = 0; i < dim; i++)
        {
            v[i] = vecA[i] + vecB[i];
        }
    
        return v;
    }
    

Anmelden zum Antworten