Private operator[] verdeckt public operator[]
-
Hi, ich stehe immer mal wieder vor folgendem Problem (reiner Democode um den Fehler zu verursachen). Der Code lässt sich mit der auskommentierten "private: operator[]" Zeile nicht kompilieren. Was ist das für ein Quatsch? Und wie bekomme ich den Code kompiliert?
prog.cpp: In function ‘int main()’: prog.cpp:22:24: error: ‘int& Test::operator[](int)’ is private within this context printf("Test: %d", t[0]); ^ prog.cpp:13:7: note: declared private here int& operator[](int index) { return _value; }
#include <iostream> using namespace std; class Test { public: Test(int value) : _value(value) { } public: const int& operator[](int index) const { return _value; } private: //int& operator[](int index) { return _value; } private: int _value; }; int main() { Test t(42); printf("Test: %d", t[0]); return 0; }
-
Die Zugriffskontrolle (private/protected/public) spielt bei der Überladungsauflösung keine Rolle. Der private Operator ist spezifischer für nichtkonstante Objekte, wird also gewählt, und rennt dann erst gegen das private.
-
Eine Möglichkeit das zu lösen, wäre den Operator explizit in einem
const
-Kontext aufzurufen:#include <utility> ... printf("Test: %d", std::as_const(t)[0]);
... oder aber zu überlegen, ob der private
operator[]
wirklich mehr Vor- als Nachteile hat. Member-Funktionen dieser Klasse könnten z.B. direkt_value
verwenden, oder man könnte stattdessen eine privateget_value
-Funktion o.ä. implementieren. Überladene Operatoren gehören für mich intuitiv immer irgendwie zum öffentlichen Interface, daher hatte ich so ein Problem bisher auch noch nicht - zumal auch der Aufruf solcher privater Operatoren immer etwas gezwungen wirkt:(*this)[0]
... stattdessen_value
oderget_value()
halte ich da auch für ein wenig lesbarer.