2013-11-27 8 views
30

Sto lavorando su C++ e ho avuto un errore che non conoscevo il motivo esatto. Ho trovato la soluzione, ma voglio ancora sapere perché.sulla conversione C++: nessuna conversione nota per argomento 1 da '[some_class]' a '[some_class] &'

class Base 
    { 
     public: 
       void something(Base& b){} 
    }; 

    int main() 
    { 
     Base b; 
     b.something(Base()); 
     return 0;   
    } 

quando compilo il codice, ho ottenuto questo errore seguente:

abc.cpp:12:20: error: no matching function for call to ‘Base::something(Base)’ 
abc.cpp:12:20: note: candidate is: 
abc.cpp:6:7: note: void Base::something(Base&) 
abc.cpp:6:7: note: no known conversion for argument 1 from ‘Base’ to ‘Base&’ 

ma quando ho sostituito b.something (Base()) in

Base c; 
b.something(c); 

l'errore è andato , Mi chiedo perché ??? non sono dello stesso tipo? Importa solo come scrivo, ma il significato dovrebbe essere lo stesso ???

Grazie Ragazzi!

+5

Sembra una domanda valida e utile - in aumento per contrastare l'inarrestabile diminuzione. – CompuChip

+2

@CompuChip le persone come te rendono questa community molto migliore. – imoutidi

risposta

32

si passa un Base oggetto temporaneo qui:

b.something(Base()); 

ma si tenta di associare che a un riferimento lvalue non const qui:

void something(Base& b){} 

questo non è consentito in C++ standard. Hai bisogno di un riferimento const.

void something(const Base& b){} 

Quando si esegue questa operazione:

Base c; 
b.something(c); 

non passa un temporaneo. Il riferimento non const si lega a c.

+0

+1 buon punto sul fatto che questo è consentito per i riferimenti const –

+1

Forse anche affermare che con vc questo potrebbe essere compilato (abbiamo notato questo come abbiamo migrato a g ++: D) – Paranaix

+0

@Paranaix VS non lo consente neanche se si ha il set di compilatori corretti ('/ W4' e'/WX') – Praetorian

2

Nel primo caso si tenta di passare un riferimento (non costante) a un argomento temporaneo come una funzione che non è possibile. Nel secondo caso si passa un riferimento a un oggetto esistente che è perfettamente valido.