Probleme bei Templateklasse und Operatoroverloading



  • Hallo,

    Ich bin gerade dabei mich in Templates einzuarbeiten und habe ein Problem beim überladen des + Operators:

    #ifndef _VECMATH_H_
    #define _VECMATH_H_
    
    template<class T> class Vector3D {
        public:
            //-(Variablen)----------------------------------------------------------
            T x, y, z;
    
            //-(Konstruktoren)------------------------------------------------------
            inline Vector3D();
            inline Vector3D(const Vector3D<T>&);
            inline Vector3D(T, T, T);
            inline Vector3D(T*);
    
            //-(Operatoren)---------------------------------------------------------
            // Arrayindizierung
            inline T& operator[](int) const;
    
            // (in place) Addition, Subtraktion, Multiplikation/Division mit Skalar
            inline Vector3D& operator+=(const Vector3D<T>&);
            inline Vector3D& operator-=(const Vector3D<T>&);
            inline Vector3D& operator*=(T);
            inline Vector3D& operator/=(T);
    
            // Vorzeichen
            inline Vector3D operator-() const;
            inline Vector3D operator+() const;
    
            // Hier ist der FEHLER, was muss ich denn schreiben um den Proto-
            // typen in die Headerdatei aufnehmen zu können?
            friend Vector3D<T>& operator+(const Vector3D<T>&, const Vector3D<T>&);
    
            //-(Methoden)-----------------------------------------------------------
            inline T length() const;
            inline T lengthSquared() const;
            inline T normalize();
    };
    
    #include "vecmath.cpp"
    
    #endif
    

    In der "vecmath.h" habe ich alle Funktionen implementiert, nur kann ich leider besagte Operator-Überladung nicht mit in den Header schreiben. Wie würde dies evtl. möglich sein?

    Es ist ja nicht unbedingt nötig, aber wäre doch schön wenn man diese Funktionen nicht erst in der *.cpp suchen muss.



  • solltest du eigentlich ohne Probleme direkt im Header implementieren können.

    Gib doch einfach mal die Fehlermeldung an. wmfrs

    Übrigens ist _VECMATH_H_ ein verbotener Bezeichner (siehe FAQ)



  • Der operator+ sollte erstens einen const Vector3D zurückgeben, keine Referenz. Zweitens muss er kein friend sein. Du kannst einfach unter die Klassendefinition in den Header schreiben:

    template<typename T>
    const Vector3D<T> operator+(const Vector3D<T>& lhs, const Vector3D<T>& rhs);
    

    BTW I: Das inline kannst du allgemein weglassen, der Compiler wird's schon richten.

    BTW II: Dein operator[] sieht komisch aus. Wie willst du denn eine T& zurückgeben, wenn der const ist? Du brauchst zwei Versionen, eine mit T& und eine mit const T&.


Anmelden zum Antworten