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 _valueverwenden, oder man könnte stattdessen eine private get_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 oder get_value() halte ich da auch für ein wenig lesbarer.


Anmelden zum Antworten