2013-11-27 30 views
30

我正在使用C++,並且有一個錯誤,我不知道確切的原因。我找到了解決方案,但仍然想知道爲什麼。關於C++轉換:從'[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&’ 

但是當我更換b.something(基地())到

Base c; 
b.something(c); 

的錯誤消失,我想知道爲什麼?他們是不是有相同的類型?它只是重要的我如何寫它,但意義應該是相同的?

謝謝!

+5

似乎是一個有效且有用的問題 - upvoted反對無法解釋的downvote。 – CompuChip

+2

@CompuChip人喜歡你讓這個社區變得更好。 – imoutidi

回答

32

您在這裏傳遞一個臨時Base對象:

b.something(Base()); 

,但你嘗試綁定是這裏一個非const左值參考:

void something(Base& b){} 

這不是標準C允許++。您需要一個const參考。

void something(const Base& b){} 

當你這樣做:

Base c; 
b.something(c); 

你是不是傳遞一個臨時的。非const引用綁定到c

+0

+1好點,這是允許const引用 –

+1

也許還聲明,用vc這可能會編譯(我們注意到這一點,因爲我們遷移到g ++:D) – Paranaix

+0

@Paranaix VS不允許它或者如果你有右編譯器標誌設置('/ W4'和'/ WX') – Praetorian

2

在第一種情況下,您嘗試將臨時參數(非常量)作爲參數傳遞給一個不可能的函數。在第二種情況下,您將引用傳遞給完全有效的現有對象。

相關問題