operator[]
-
Hallo!
Ich habe folgeden Code (vereinfacht):
.h:
class Vector{ private: float val[2]; public: Vector(); Vector(const Vector& vec2); Vector(float x, float y); float& operator[](const int index); };.cpp:
Vector::Vector(){ this->val[0] = 0; this->val[1] = 0; } Vector::Vector(const Vector& vec2){ this->val[0] = vec2[0]; this->val[1] = vec2[1]; } Vector::Vector(float x, float y){ this->val[0] = x; this->val[1] = y; } float& Vector::operator[](int index){ return val[index]; }Der VC++ Compiler akzeptiert das. Der gcc gibt folgenden Error aus:
"error: passing `const Vector' as `this'
argument of `float& Vector::operator[](int)' discards
qualifiers"Ich nehme an dass das was mit dem const zu tun hat, wo ja der VC++ nach meinen Erfahrungen prinzipiell etwas toleranter ist. Wie muss denn das Codefragment laut Standard lauten, so dass es der gcc auch versteht?
Danke im Voraus!
mfg
-
Randfrage: In welchem Zusammenhang wird der Operator aufgerufen?
Womöglich benötigst du noch eine const-Version davon, um den Operator auch mit konstanten Vektoren und temporären Werten aufzurufen:
float Vektor::operator[](int index) const { return val[i]; }
-
Der Operator [] wird im Copy-Konstruktor verwendet.
mfg
-
Füge nen const, wie CStoll es hat, ein und dann passt es.
-
ChrisR schrieb:
Der Operator [] wird im Copy-Konstruktor verwendet.
OK, das hatte ich übersehen. Und dort findest du auch den Grund für die Fehlermeldung - 'vec2' ist konstant und der operator[] ist es nicht (könnte also den this-Vektor verändern).
Btw, an der Stelle brauchst du doch gar nicht das öffentliche Interface von vec2 - wenn du dort die Aufrufe "vec2[..]" ersetzt durch "vec2.val[..]", klappt das auch.