Raetselhafter Fehler bei copycon (passing ... as 'this' argument of ... discards qualifiers)



  • Hallo Forum,

    ich bin recht unerfahren, was C++ angeht - ausser kleineren Projekten hab ich noch nichts mit C++ gemacht. Das soll sich jetzt aendern. Bis gerade eben lief es auch ganz gut, aber jetzt bekomme ich einen Fehler, den ich nicht verstehe:

    util/Vector.h: In copy constructor 'Vector<N, T>::Vector(const Vector<N, T>&) [with int N = 3, T = double]':
    framedata/VectorFrameData.h:11:   instantiated from here
    util/Vector.h:91: error: passing 'const Vector<3, double>' as 'this' argument of 'T Vector<N, T>::get(int) [with int N = 3, T = double]' discards qualifiers
    util/Vector.h: In member function 'Vector<N, T>& Vector<N, T>::operator=(const Vector<N, T>&) [with int N = 3, T = double]':
    framedata/VectorFrameData.h:17:   instantiated from here
    util/Vector.h:115: error: passing 'const Vector<3, double>' as 'this' argument of 'T Vector<N, T>::get(int) [with int N = 3, T = double]' discards qualifiers
    

    Das ganze passiert im Copy-Constructor und im ueberladenen operator=:

    template<int N, typename T>
    class Vector
    {
    public:
            Vector(Vector<N,T> const& other);
    --8< schnipp --
            Vector<N,T>& operator=(Vector<N,T> const& other);
    --8< schnapp --
    };
    
    template<int N, typename T>
    Vector<N, T>::Vector(Vector<N,T> const& other)
    {
            for (int i = 0; i < N; ++i) {
                    set(i, other.get(i));
            }
    }
    
    --8< schnipp --
    
    template<int N, typename T>
    Vector<N,T>& Vector<N,T>::operator=(Vector<N,T> const& other)
    {
            for (int i = 0; i < N; ++i) {
                    set(i, other.get(i));
            }
            return *this;
    }
    

    Der Fehler ist jeweils dort, wo "set(i, other.get(i));" steht.

    In der Datei VectorFrameData.h steht folgendes:

    VectorFrameData(Vector<3,double> &v) : m_value(v) {}
    (...)
    void setData(Vector<3, double> &v) { m_value = v; }
    

    Ich hab wie gesagt keine Ahnung, wie ich das beheben kann und Google hat mir auch nicht wirklich geholfen.
    Was bedeuetet dieser Fehler?

    Gruss,
    Matthias


  • Mod

    Deine Funktion
    T Vector<N, T>::get(int)
    benötigt ein modifizierbares Objekt als Objektargument.
    In
    other.get(i)
    ist other aber nicht modifizierbar. Da get tatsächlich (logisch) keine Veränderungen am Objekt vornimmt, mithin auch auf konstante Objekte angewandt werden soll, muss es entsprechend deklariert werden:

    template<int N, typename T>
    class Vector
    {
    ...
        T get() const;
    ...
    

    Die Fehlermeldung

    error: passing 'const Vector<3, double>' as 'this' argument of 'T Vector<N, T>::get(int) [with int N = 3, T = double]' discards qualifiers

    ist so zu verstehen. Wenn der Compiler den Ausdruck

    other.get()
    

    als Aufruf der Funktion
    Vector<N, T>::get(int)
    auslegen würde, müsste er die const-Qualifikation des Objektarguments fallen lassen (was natürlich nicht erlaubt ist).



  • Hmm, haette nicht gedacht, dass die Loesung so simpel ist 😉

    Vielen Dank fuer die schnelle Antwort!


Anmelden zum Antworten