operator += ueberschreiben



  • template<typename T>
    class base {
        T m_var;
    
    public:
        base(const T& value): m_var(value) {};
        base<T> operator +=(const base<T>&	obj){ 
            this->m_var += obj.m_var;              // hier soll der fehler sein
            return *this;
        };
    };
    
    class derived: public base<LPSTR> {
    public:
        base<LPSTR> operator +=(const base<LPSTR>&	obj){
            return *this;
        };
    };
    

    folgende kompilierfehler bekomme ich, ich hab doch die operator funktion in derived ueberschrieben, warum trotz fehler?

    Error 1 error C2297: '+=' : illegal, right operand has type 'const LPSTR ' ZProject



    base& operator+= (const base &obj){
            m_var += obj.m_var;              // hier soll der fehler sein
            return *this;
        };
    };
    
    1. LPSTR klingt nach nem pointer - dort sollte der += op nicht gerade das machen, was du erwartest...

    bb



  • kann mir niemand weiterhelfen?


  • Mod

    Deine Fehlermeldung bedeutet, dass es keinen Operator += mit LPSTR auf beiden Seiten gibt. Da unskilled wahrscheinlich richtig vermutet, dass es sich um einen Pointertyp handelt, macht das auch Sinn.

    Für eine weiterführende Hilfe müsstest du uns sagen, was LPSTR ist und was du erreichen willst. Sollte LPSTR nämlich wirklich etwas Pointerartiges sein, dann macht die Operation += nämlich herzlich wenig Sinn und es deutet darauf hin, dass du eigentlich etwas anderes möchtest.



  • Naja das is ja nicht seine Frage.

    @JnZn558:
    Der Fehler kommt, da trotz Überschreiben die Basisklassen-Version generiert wird.
    Du könntest stattdessen die Basisklassen-Version spezialisieren:

    template <>
    base<char*> base<char*>::operator += (base<char*> const& rhs)
    {
        return *this;
    }
    

    Und BTW: Den Operator += lässt man normalerweise eine Referenz auf *this zurückgeben, nicht eine Kopie wie du das machst.


  • Mod

    hustbaer schrieb:

    Der Fehler kommt, da trotz Überschreiben die Basisklassen-Version generiert wird.

    Wenn du mit Generieren Instantiieren meinst: dafür gibt es im gezeigten Code keinen Grund - der ist also vermutlich unvollständig.

    Abgesehen davon wundert mich etwas, dass noch keiner darauf hingewiesen hat, dass es hier um Überladung und nicht um Überschreiben geht.


Anmelden zum Antworten