2013-11-27 5 views
30

Ich arbeite an C++, und hatte einen Fehler, dass ich den genauen Grund nicht kannte. Ich habe die Lösung gefunden, möchte aber trotzdem wissen warum.über C++ - Konvertierung: keine bekannte Konvertierung für Argument 1 von '[some_class]' zu '[some_class] &'

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

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

, wenn ich den Code kompilieren, ich habe diesen folgenden Fehler:

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&’ 

aber wenn ich b.something (Base()) in

ersetzt
Base c; 
b.something(c); 

der Fehler ist weg Ich frage mich warum ??? haben sie nicht den gleichen Typ? Es ist nur wichtig, wie ich es schreibe, aber die Bedeutung sollte gleich sein ???

Danke Jungs!

+5

Scheint wie eine gültige und nützliche Frage - upvoted gegen den unerklärten Downvote. – CompuChip

+2

@CompuChip Leute wie Sie machen diese Gemeinschaft viel besser. – imoutidi

Antwort

32

Sie passieren ein temporäres Base Objekt hier:

b.something(Base()); 

aber Sie versuchen, das zu einem nicht konstanten lvalue Bezug zu binden hier:

void something(Base& b){} 

Dies ist nicht in Standard-C erlaubt ++. Sie benötigen eine const Referenz.

void something(const Base& b){} 

Wenn Sie dies tun:

Base c; 
b.something(c); 

Sie eine temporäre nicht vorbei. Die nicht konstante Referenz bindet an c.

+0

+1 guter Punkt auf die Tatsache, dass dies für const Referenzen zulässig ist –

+1

Vielleicht auch, dass mit VC dies kompilieren könnte (wir haben dies bemerkt, wie wir nach g ++ migriert: D) ​​ – Paranaix

+0

@Paranaix VS erlaubt es auch nicht, wenn Sie die haben rechte Compiler-Flags gesetzt ('/ W4' und'/WX') – Praetorian

2

Im ersten Fall versuchen Sie, einen (nichtkonstanten) Verweis auf ein temporäres als Argument an eine Funktion zu übergeben, was nicht möglich ist. Im zweiten Fall übergeben Sie einen Verweis auf ein vorhandenes Objekt, das absolut gültig ist.

Verwandte Themen