2013-07-13 76 views
4

我重載以下比運營商更大的使用時:不匹配操作>與函數

bool operator > (Person & a, Person & b) 
{ 
    //firstname is a string data type 
    return (a.FirstName > b.FirstName);  
} 

,如果我有類似如下的正常工作:

Person a = myPersonA; 
Person b = myPersonB; 

return myPersonA > myPersonB; 

然而,內我的Person類我定義了一個Person getByID(int id)函數,該函數返回給定ID的Person實例。如果我嘗試使用我的操作與返回的值從這個函數是這樣的:

bool whosGreater = listPeople.getById(1) > listPeople.getById(2); 

我得到"Error: no match for operator >(Person&, Person&)"

,但如果我這樣做了以下正常工作:

Person a = listPeople.getById(1); 
Person b = listPeople.getById(2); 
bool whosGreater = a > b; 

有我在這裏沒有看到的東西?在我看來,它應該工作。 PS:這是爲了作業,所以我可以真正擺脫聲明變量並賦予它們什麼函數返回並逃脫它,但我想知道發生了什麼,以便我可以學習。我嘗試過使用Google搜索,但我無法提出正確的問題。

+1

有趣。在C#中這將工作。 C++必須明確要求你聲明返回的Person將被放置到的「box」;在C#中,該框將隱式存在,但當它不再需要時,它也會自動收集垃圾。 –

+0

是的,我想知道同樣的事情。我可以用任何.Net語言和其他腳本語言來做到這一點。 C++是非常不同的,錯誤不像我希望的那樣具有描述性。 –

回答

6

從函數返回的值是暫時值,而不是「正常的」 Person對象。臨時值只能作爲常量參數引用傳遞,因此將參數更改爲const引用應該很好;

bool operator > (const Person & a, const Person & b) 
{ 
    //firstname is a string data type 
    return (a.FirstName > b.FirstName);  
} 
+0

謝謝,這工作。還有其他編程語言允許這種行爲,即使返回的值仍然是暫時的。我有很多要學習。 –

5

讓它:

bool operator > (Person const & a, Person const & b) 
{ 
    //firstname is a string data type 
    return (a.FirstName > b.FirstName);  
} 

正常引用不能綁定到臨時對象(如getById返回一個())。而且你不是在對象中傳遞變異,所以使引用爲const。

相關問題