2013-04-18 75 views
0

對我的字符串類有另一個錯誤。 intellisense不會讓我使用strcmp來比較一個對象與自我調用對象(即* this)。錯誤:非const引用的初始值必須是左值

我試着讓自己的操作符轉換函數來幫助這個,但它仍然給我錯誤。

我需要更改我的代碼才能使其工作?

//Overloaded comparison operators 
bool &String::operator<(const String & obj) 
{ 
    return strcmp(*this, obj) < 0 ? true : false; 
} 

//Operator conversion function 
String::operator char const *() const 
{ 
    return mStr; 
} 
+1

爲什麼返回從這個'布爾&',它沒有意義。只需返回一個「布爾」。 – Yuushi 2013-04-18 06:14:30

回答

3

您正在返回對局部變量的引用。按價值回報。您還可以簡化迴歸表達,使該方法const,因爲比較兩個對象不應該改變它們中的:

bool String::operator<(const String & obj) const { 
    return strcmp(*this, obj) < 0; 
} 

雖然我不知道 strcmp可以處理兩個 String s,這就是你正在通過它。從以前的問題Judgning,你需要

return strcmp(mstr, obj.mStr) < 0; 

+0

但他有一個'運算符char const *()const',所以我認爲他可以直接把它放在strcmp中。 – Detheroc 2013-04-18 06:24:05

+0

@Dheheroc謝謝,我完全錯過了。 – juanchopanza 2013-04-18 06:27:36

1

讓它const並刪除&

bool String::operator<(const String & obj) const 
              ^^^^^ 

返回臨時對象的引用會導致不確定的行爲。

0

錯誤消息明確指出的strcmp()第一個參數,*這是一個右值,但STRCMP需要一個左值,嘗試添加一個句子前:

String thisObj = *this; 
+0

這根本不正確。 – 2013-08-24 19:14:14

+1

爲什麼?你能告訴更多嗎? – 2014-03-15 06:15:32

+0

'*這'不是一個右值。特別是,你知道它的地址(這是'this')。右值是由隱式調用'String :: operator char const *()const'創建的臨時值。 – 2014-03-15 13:09:42

相關問題