2013-11-27 8 views
30

私はC++で作業しており、正確な理由はわかりませんでした。私は解決策を見つけましたが、それでも理由を知りたいと思っています。about C++ conversion: '[some_class]'から '[some_class]&'への引数1の既知の変換はありません。

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

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

私はコードをコンパイルするとき、私はこの次のエラーました:

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

を私は

Base c; 
b.something(c); 

にb.something(ベースを())に交換したときにエラーがなくなっています、私はなぜ思っていますか???彼らは同じ種類がありますか?それは私がそれをどのように書くかだけが重要ですが、意味は同じでなければなりません???

ありがとうございました!

b.something(Base()); 

いますが、ここでは非const左辺値参照にそれをバインドしよう:

+5

有効で有用な質問のようです - 原因不明のdownvoteに対抗するためにupvoted。 – CompuChip

+2

@CompuChipあなたが好きな人は、このコミュニティをもっと良くする。 – imoutidi

答えて

32

あなたはここに一時的Baseオブジェクトを渡している

void something(Base& b){} 

これは、標準のC++で許可されていません。あなたはconstリファレンスが必要です。

void something(const Base& b){} 

あなたが行う場合は、この:

Base c; 
b.something(c); 

あなたは一時的に合格されていません。非const参照はcにバインドされます。

+0

これはconst参照のための+1の良い点です –

+1

vcでこれがコンパイルされるかもしれないと述べているかもしれません(私たちはg ++:Dに移行したのでこれに気付きました) – Paranaix

+0

@Paranaix VSは、 ( '/ W4'と'/WX') – Praetorian

2

最初の場合、一時的な引数として(非const)参照を不可能な関数に渡そうとします。後者の場合、完全に有効な既存のオブジェクトへの参照を渡します。

関連する問題