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 qualifiersDas 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
-
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!