2012-12-03 11 views
5

In generale, come si dichiara l'operatore dell'indice [ ] di una classe per gli accessi sia in lettura che in scrittura?C++: sovraccarico dell'operatore [] per l'accesso in lettura e scrittura

ho provato qualcosa di simile

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

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

che mi dà l'errore

../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)' 

risposta

14

La versione mutevole va bene:

T& operator[](T u); 

ma la versione const dovrebbe essere una funzione const membro come pure che restituisce un riferimento const:

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

Questo non solo lo distingue dagli altri sovraccarico, ma consente anche l'accesso (di sola lettura) alle istanze della classe const. In generale, le funzioni membro sovraccarico possono essere distinte dai relativi tipi di parametri e qualifiche costanti/volatili, ma non dai rispettivi tipi di ritorno.

6

Devi semplicemente un sovraccarico che sarà utilizzato sia per lettura e scrittura:

T& operator[](int); 

Detto questo, potresti anche volere un sovraccarico const:

const T& operator[](int) const; 

Ciò fornirà indicizzazione di sola lettura nelle istanze della classe const.

+0

Solo per aggiungere ulteriori spiegazioni, ciò è dovuto al fatto che il sovraccarico dell'operatore restituisce un riferimento all'oggetto. Questo ti permette di assegnarlo e leggerlo, quindi la necessità di un solo sovraccarico. – Chris

2

Si ottiene l'errore, poiché le funzioni sovraccaricate non possono differire solo dal tipo di ritorno. Ma possono differire per costanza.

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

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

Nota "scrivere" e "leggere" i posti scambiati.

Inoltre, in realtà non si intende che l'argomento dell'operatore sia di tipo integrale?