2012-12-03 15 views
5

Ogólnie, jak zadeklarować operator indeksu [ ] dla dostępu do odczytu i zapisu?C++: Przeciążanie operatora [] w celu odczytu i zapisu

Próbowałem coś podobnego

/** 
* Read index operator. 
*/ 
T& operator[](T u); 

/** 
* Write index operator 
*/ 
const T& operator[](T u); 

co daje mi błąd

../src/Class.h:44:14: error: 'const T& Class::operator[](T)' cannot be overloaded 
../src/Class.h:39:8: error: with 'T& Class::operator[](T)' 

Odpowiedz

14

Twój zmienny wersja jest w porządku:

T& operator[](T u); 

ale wersja const powinna być funkcją const członka, jak również zwrócenie const odniesienie:

const T& operator[](T u) const; 
         ^^^^^ 

To nie tylko odróżnia go od innych przeciążenie, ale umożliwia także (tylko do odczytu) dostęp do instancji klasy. Ogólnie rzecz biorąc, przeciążone funkcje składowe można rozróżnić na podstawie ich typów parametrów i stałych/zmiennych kwalifikacji, ale nie na podstawie ich typów zwracanych.

6

po prostu mieć jeden przeciążenie, że będziemy stosować zarówno odczytuje i zapisuje:

T& operator[](int); 

Powiedziawszy to, możesz również chcieć mieć przeciążenie const:

const T& operator[](int) const; 

Zapewni to indeksowanie tylko do odczytu w instancjach klasy const.

+0

Wystarczy dodać dodatkowe wyjaśnienie, ponieważ przeciążenie operatora zwraca odniesienie do obiektu. Pozwala to przypisać do niego i go odczytać, stąd potrzeba tylko jednego przeciążenia. – Chris

2

Otrzymujesz błąd, ponieważ przeciążone funkcje nie mogą się różnić tylko typem powrotu. Ale mogą się różnić konstytucją.

/** 
* Write index operator. 
*/ 
T& operator[](T u); 

/** 
* Read index operator 
*/ 
const T& operator[](T u) const; 

Uwaga "pisz" i "czytaj" zamienione miejsca.

Co więcej, czy nie masz na myśli argumentu operatora, że ​​jest integralnym typem?