Newsgroup: it.comp.lang.c++
Titolo: operator cast fa da operator[]

Salve ha tutti, ho un problema che non riesco a capire:
perchè il seguente codice compila?
class A
{
         public:
                 operator bool() const { return(true); };
};
int main()
{
         A b;
         b["T"];
};
io mi aspetterei un errore in quanto non è definito nessun overload
per l'operatore[] nella classe A.
Questo mi da problemi quando in una classe devo definere sia operatori
di cast che [].
chi me lo spiega?
PS: uso g++ come compilatore, ho provato le version 3.3, 4.0 e 4.1
Ciao
Lash

 per l'operatore[] nella classe A.
Azzardo (perche' non ho modo di provarlo adesso)... forse perche' in A
hai anche variabili public, per cui lui intende con b["T"] di andarsi a
prendere la variabile che sta all'indirizzo &b + 'T'?
Io direi pure di fare l'overload di [].
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 chi me lo spiega?
Per motivi storici l'espressione a[b] e' identica a b[a], quindi
l'espressione sopra si puo' riscrivere come
"T"[b]
"T" e' un array di caratteri e b grazie al tuo operatore e'
convertibile ad un'espressione intera che vale 1.
Per evitare questo tipo di problemi la soluzione piu' semplice e'
ovviamente non implementare la conversione a booleano; a mio avviso
tale conversione e' indispensabile solo se si sta implementando uno
smart pointer o una classe che deve comportarsi come uno stream.
Se proprio non se ne puo' fare a meno si implementa al posto della
conversione a booleano la conversione ad un puntatore a membro della
classe in questione e ci si affida alla conversione automatica da
puntatore a membro a booleano, ad es.
class A {
    typedef int A::* booleano_non_specificato;
  public:
    operator booleano_non_specificato() const {
      return condizione ? &A::i : 0;
    }
  private:
    int i;
};
Questo evita il tuo problema perche' per convertire b a booleano sono
necessarie due conversioni (da A a booleano_non_specificato e da
booleano_non_specificato a bool), mentre il compilatore puo' applicarne
una sola.
Ciao,
Nicola

 l'espressione sopra si puo' riscrivere come
In C++ non puoi dire una cosa del genere (è facile dimostrare il contrario).
Diciamo invece che ci sono degli operatori operator[] built-in.
Kiuhnm

 
a cosa servono?
ci sono modi per "evitarli" o uso il metodo consigliatomi da Nicola?
Grazie
Ciao
  Lash

 a cosa servono?
credo servano a gestire gli array di oggetti ... se fai
A *a=new a[12] l'operatore [] di default viene usato per esempio con 
a[i] per gestire un riferimento all'iesimo elemento


 a[i] per gestire un riferimento all'iesimo elemento
si ma allora dovrebbero esserci sempre, mentre se dichiaro una classe:
class A
{
	public:
		operator[](std::string){};
};
non mi da problemi,
se aggiungo:
		operator bool(){};
mi da il seguente errore:
error: ambiguous overload for 'operator[]' in 'b["T"]'
note: candidates are: operator[](int, const char*) <built-in>
ora capisco il significato di <built-in> prima pensavo che chi sa cosa..
xke se aggiungo un operatore di cast mi aggiuge questi operatori build-in?

 xke se aggiungo un operatore di cast mi aggiuge questi operatori build-in?
L'operatore di indicizzazione builtin esiste sempre, ma e' il tuo
operatore di conversione che lo rende un candidato valido. Questo
perche' come dicevo nel mio messaggio precedente bool e' promovibile ad
un intero, che come vedi dal messaggio che hai trascritto sopra e' il
tipo richiesto come primo parametro.
Ciao,
Nicola

 tipo richiesto come primo parametro.
ho risolto creando un operator[](const char*)
Ciao

 
no scherzavo
se aggiungo operator[](unsigned int)
mi genera un: error: ambiguous overload for 'operator[]'
quindi ho implementato la parte sul "falso bolleano" e
operator[](const char*) è tornato operator[](std::string)
Ciao