coreyt (Normal User)
Rookie
Messaggi: 21
Iscritto: 28/02/2010
|
Salve a tutti.
Ho un problema con la restituzione di un oggetto in una funzione, nello specifico ho creato una classe Lista_puntatore con relativo costruttore di copia e operatore = sovraccaricato, però, quando creo una funzione che restituisce un oggetto Lista_puntatore il compilatore mi segnala il seguente errore:
no match for 'operator=' in 'l = b(Lista_puntatore<T> [with T = int]()'
candidates are: Lista_puntatore<T>& Lista_puntatore<T>::operator=(Lista_puntatore<T>&) [with T = int]
Per quanto riguarda la realizzazione della classe è la seguente:
Codice sorgente - presumibilmente C/C++ |
template <class T>
class Lista_puntatore : public Lista <T, Cella_lista<T> *>
{
public:
....
Lista_puntatore (Lista_puntatore<T> &lista); //costruttore di copia
Lista_puntatore<T>& operator= (Lista_puntatore<T>& lista); //sovraccarico operatore =
....
}
|
sapete dirmi perchè mi da l'errore in fase di compilazione?
Grazie in anticipo per l'aiuto.
Ultima modifica effettuata da coreyt il 04/03/2013 alle 20:04 |
|
crybot (Member)
Pro
Messaggi: 115
Iscritto: 13/09/2011
|
l'errore non e` generato dalla definizione delle funzioni, ma da un'assegnazione che fai:
no match for 'operator=' in 'l = b
|
|
coreyt (Normal User)
Rookie
Messaggi: 21
Iscritto: 28/02/2010
|
e come potrei fare per assegnare ad l la lista restituita dalla funzione b?
|
|
crybot (Member)
Pro
Messaggi: 115
Iscritto: 13/09/2011
|
dovremmo vedere il pezzo di codice dal quale si genera l'errore
|
|
coreyt (Normal User)
Rookie
Messaggi: 21
Iscritto: 28/02/2010
|
Si, diciamo che stavo facendo delle prove per poter risolvere il problema, ho questa semplice funzione:
Codice sorgente - presumibilmente C/C++ |
template <class T>
Lista_puntatore<T> b (Lista_puntatore<T> l)
{
Lista_puntatore<T> a;
a.insLista (5, a.primoLista());
return a;
}
|
richiamata dal main in questo modo:
Codice sorgente - presumibilmente C/C++ |
int main(int argc, char *argv[])
{
Lista_puntatore<int> l;
l = b(l);
}
|
invece per quanto riguarda l'operatore = dichiarato nella classe Lista_puntatore è il seguente:
Codice sorgente - presumibilmente C/C++ |
template <class T>
Lista_puntatore<T>& Lista_puntatore<T>::operator = (Lista_puntatore<T>& lista)
{
elemLista val;
pos posizione1, posizione2;
posizione1 = lista.primoLista();
creaLista();
posizione2 = primoLista();
while (!lista.fineLista(posizione1))
{
val = lista.leggiLista(posizione1);
insLista (val, posizione2);
posizione1 = lista.succLista (posizione1);
posizione2 = ultimoLista();
}
return *this;
}
|
e, se può servire, il costruttore di copia invece è il seguente:
Codice sorgente - presumibilmente C/C++ |
template <class T>
Lista_puntatore<T>::Lista_puntatore (Lista_puntatore<T> &lista)
{
pos posizione1, posizione2;
posizione1 = lista.primoLista();
creaLista();
posizione2 = primoLista();
while (!lista.fineLista(posizione1))
{
insLista (lista.leggiLista(posizione1), posizione2);
posizione1 = lista.succLista(posizione1);
posizione2 = ultimoLista();
}
}
|
Grazie per le risposte. |
|
crybot (Member)
Pro
Messaggi: 115
Iscritto: 13/09/2011
|
devi permettere all'overload dell'operatore di assegnamento di accettare riferimento costanti, questo perche` l'oggetto ritornato dalla funzione b() e` un l-value, che non puo` comparire sulla destra di un espressione che ne richiede il riferimento senza il qualificatore const, quindi:
const Lista_puntatore<T>& operator= (const Lista_puntatore<T>& lista);
la restituzione di un oggetto const impedisce assegnamenti del tipo (a = b) = c
Ultima modifica effettuata da crybot il 07/03/2013 alle 18:12 |
|
coreyt (Normal User)
Rookie
Messaggi: 21
Iscritto: 28/02/2010
|
Grazie mille, ora funziona comunque non ho capito bene il perchè necessita di const, potresti rispiegarmelo gentilmente?
|
|
crybot (Member)
Pro
Messaggi: 115
Iscritto: 13/09/2011
|
Postato originariamente da coreyt:
Grazie mille, ora funziona comunque non ho capito bene il perchè necessita di const, potresti rispiegarmelo gentilmente? |
si, in effetti ho fatto un po' di confusione:
la tua funzione b() restituisce un r-value, poiche` un oggetto restituito da una funzione e` un l-value soltanto se restituito come un riferimento.
A questo punto tu passi all'operatore ridefinito di assegnamento un r-value come riferimento, ma il compilatore non te lo permette perche` potresti rischiare di modificare il parametro, quindi richiede const.
spero di essermi spiegato meglio |
|
coreyt (Normal User)
Rookie
Messaggi: 21
Iscritto: 28/02/2010
|
Si si ora ho capito meglio. Grazie per la pazienza
|
|