2014-02-24 67 views
-3

將此代碼放在一個簡單的類中爲Arduino項目組成的兩個整數(日/小時)組成的時間。運算符重載,const和#arguments錯誤

bool operator <= (const Time& other) const{ 
    return (day <= other.day && hour <= other.hour); 
} 

雖然我也有一個使用相同的語法與同非靜態的形式......我收到以下錯誤幾乎相同的(和工作)其他類:

error: non-member function ‘bool operator<=(const Time&)’ cannot have cv-qualifier 
error: ‘bool operator<=(const Time&)’ must take exactly two arguments 

儘管在過去的半小時內用Google搜索了類似的錯誤,但我擔心自己不知所措。 謝謝!

+0

@juanchopanza _'Drop最後const'_當然?較少/相等的比較運算符不應該改變底層類中的任何內容以返回正確的結果。 –

+0

@πάνταῥεῖ這是非會員。 – juanchopanza

+0

@juanchopanza不是從sig所示的(但是從錯誤信息當然是D!) –

回答

0

如果該操作被宣佈爲一個類的成員函數,那麼你需要將它定義下列方式

bool Time::operator <= (const Time& other) const{ 
    return (day <= other.day && hour <= other.hour); 
} 

還要考慮到操作員中的條件是無效的。 應該有

bool Time::operator <= (const Time& other) const{ 
    return (day <= other.day) && (other.day > day || hour <= other.hour)); 
} 
+0

謝謝,我不能相信我忽略了忘記Time ::,就是這樣。 – user3299912

+0

@ user3299912你是否已經低估了我的答案? –

+0

爲什麼downvote? –

3

您有非會員比較運算符。這是有道理的,這是一個非成員,而不是一個成員,但它需要兩個參數,並且不能const

bool operator <= (const Time& lhs, const Time& rhs) { .... } 

此外,您還需要修復的比較邏輯。我非常懶,所以我會這樣做:

#include <tuple> 

bool operator <= (const Time& lhs, const Time& rhs) 
{ 
    return std::tie(lhs.day, lhs.hour) <= std::tie(rhs.day, rhs.hour); 
} 

查看更多關於operator overloading here

+0

對於OP:我想你想'lhs.day

1
error: non-member function ‘bool operator<=(const Time&)’ cannot have cv-qualifier 

您可以常量預選賽不能添加到非成員函數。 讓我來解釋一下爲什麼

成員函數後的const保證這個函數不會改變任何成員變量this。現在,如果您沒有任何this的引用,靜態函數將會保證什麼?

error: ‘bool operator<=(const Time&)’ must take exactly two arguments 

有兩種重載操作符的方法。你可以讓他們的成員函數(不帶靜電),但如果你想比較intTime例如..讓我們將它寫出來:

在Time類

,寫出下列操作:

bool operator<=(int rhs) const {return this.minutes <= rhs;} 

現在,讓我們比較我們的數據:

Time time; 
int integer; 
if(time <= integer) {} //This will compile 
if(integer <= time)() //This will not compile 

讓我們看看這是爲什麼:

if(time <= integer) {} //Will expand to this: 
if(time.operator<=(integer)) {} 

現在你能猜到這是什麼嗎?

if(integer <= time) {} //Will expand to this: 
if(integer.operator<=(time)) {} 

有沒有這樣的操作對於像整數默認類型,你不能只是簡單地添加一個整數類型。

對此的解決方案是靜態運算符。 爲了掩蓋這兩種情況下(INT < =時間和時< = INT) 你可以這樣寫操作,以及在你的Time類

static bool operator<=(int lhs, const Time& rhs) {}; 

的參數是比較的左側的右側比較。

我也建議你看一看juanchopanza的鏈接:

See more on operator overloading here .

this link成員函數運營商和非成員函數運營商之間的差異。