PDA

View Full Version : C++ "Ambiguos overload operator" PERCHE'?


gabriele84
17-05-2006, 15:55
#include <iostream.h>

istream &operator>>( istream &s, bool &b)
{
int r;
s >> r;
if (r)
b=true;
else
b=false;
return s;
}

int main()
{
bool aperto=true;
int num_tes,i;
List<Tessera> garage;
while (aperto)
{
cout << "Numero di tessera cliente: ";
cin >> num_tes;
garage.Inserisci(num_tes);
cout << "Immettere: 0=Chiusura, 1=Nuovo Cliente";
cin >> aperto;
//MI DA ERRORE SU QUESTA LINEA
}
cout<<"Posto n.\tCliente\n";
for(i=0;i<garage.PostiOccupati();i+)
cout<<" "<<i<<"\t\t "<<garage.Posto(i)<<endl;
return 0;
}

poi su manca la parte dove definisco la classe tessera e le varie funzioni

AIUTATEMI

gabriele84
17-05-2006, 20:07
HELP MEEEEEEEE

gabriele84
18-05-2006, 08:39
Nessuno mi aiuta? :(

Ziosilvio
18-05-2006, 08:47
Innanzitutto, sei su un forum e non in chat, quindi non avere fretta e lascia sempre passare almeno 24 ore prima di ripetere la richiesta di aiuto.

Poi: a naso, direi che c'č un problema di livello di visibilitā.
Tu ridefinisci a modo tuo l'operatore >>, ma lo fai nel corpo principale del programma, quindi l'overloading vale in tutto il programma.
Ma l'operatore >> č giā ridefinito all'interno della classe istream.
Di conseguenza, alla riga in cui ti dā errore, il compilatore non sa se deve usare >> o istream::operator>>, ossia non č in grado di scegliere tra la definizione data da te e quella fornita dalla classe istream.

gabriele84
18-05-2006, 09:41
Innanzitutto, sei su un forum e non in chat, quindi non avere fretta e lascia sempre passare almeno 24 ore prima di ripetere la richiesta di aiuto.

Poi: a naso, direi che c'č un problema di livello di visibilitā.
Tu ridefinisci a modo tuo l'operatore >>, ma lo fai nel corpo principale del programma, quindi l'overloading vale in tutto il programma.
Ma l'operatore >> č giā ridefinito all'interno della classe istream.
Di conseguenza, alla riga in cui ti dā errore, il compilatore non sa se deve usare >> o istream::operator>>, ossia non č in grado di scegliere tra la definizione data da te e quella fornita dalla classe istream.


Si ma come risolvo?
Voglio dire,
se io ridefinisco un operatore, il compilatore non č costretto ad usare la mai definizione?
Anche sui libri di testo riporta esempi come il mio programma...

Ziosilvio
19-05-2006, 09:59
come risolvo?
Non sono uno specialista del C++, ma le cose si imparano anche risolvendo i problemi, quindi in finale cercare di risponderti fa bene anche a me.
Dunque: sempre a naso, direi che dovresti definire una sottoclasse di std::istream in cui ridefinisci l'operatore >>, e creare un'istanza di tale classe in cui "copi" cin e della quale usi il >>.
Anche sui libri di testo riporta esempi come il mio programma
Che testo stai usando?

gabriele84
19-05-2006, 10:45
Non sono uno specialista del C++, ma le cose si imparano anche risolvendo i problemi, quindi in finale cercare di risponderti fa bene anche a me.
Dunque: sempre a naso, direi che dovresti definire una sottoclasse di std::istream in cui ridefinisci l'operatore >>, e creare un'istanza di tale classe in cui "copi" cin e della quale usi il >>.

Che testo stai usando?

La programmazione ad oggetti ATLAS
ma il discorso č...
se devo andare a fare tuto sto parapiglia, a che serve l'operator overload?
Voglio dire il guadagno sta appunto nell'attuare una ridefinizione in poche righe altrimenti tanto vale creare una funzione che faccia il suo dovere e amen!
Grazie dell'aiuto :)

Ziosilvio
21-05-2006, 11:13
se devo andare a fare tuto sto parapiglia, a che serve l'operator overload?
Fare l'overload di un operatore, o di una funzione, significa poter usare la stessa parola con significati diversi in contesti diversi.
Ad esempio, l'operatore binario >> ha il significato di shift quando i suoi operandi sono interi, ossia quando il contesto č (int,int); ma ha il significato di lettura di un token che rappresenta un numero in virgola mobile quando il suo operando sinistro č un riferimento a un oggetto di tipo istream e il suo operando destro č un double, ossia quando il contesto č (istream&,double).
Ora, tu hai definito un'altra volta >>, ma sempre in un contesto (istream&,double). Il risultato č che il compilatore non sa quale usare.
La soluzione che ti avevo detto prima porta il contesto di >> in una cosa del tipo (subclass_of_istream&,double), che non dā problemi di interpretazione.