爲什麼這個代碼給出錯誤消息「智能感知:這個操作符的功能太多的參數」運營商+超載問題
int operator+(PerfectNum a,PerfectNum b)
{
return (a.thenum+b.thenum);
}
PerfectNum是一個普通班,並thenum是一個int。 此方法在課程中。
爲什麼這個代碼給出錯誤消息「智能感知:這個操作符的功能太多的參數」運營商+超載問題
int operator+(PerfectNum a,PerfectNum b)
{
return (a.thenum+b.thenum);
}
PerfectNum是一個普通班,並thenum是一個int。 此方法在課程中。
你正在將它定義爲一個成員函數,對吧?
在這種情況下,左側是簡單*this
:
// .h
class PerfectNum
{
public:
int operator+(PerfectNum other) const;
};
// .cpp
int PerfectNum::operator+(const PerfectNum &other) const
{
return this->thenum + other.thenum;
}
錯誤的種類。運營商應該是一個免費的功能,可能是一個朋友。如果它是一個成員,它應該是const。該參數應該是一個常量引用。語法錯誤 - 實現缺少返回類型。誰在投票這個東西? – 2011-06-13 22:54:23
糟糕。你是對的,這是非常可怕的。昨天我有一個相當緊張的工作日,我需要擺脫它,但顯然我留下了一些我的知識:-) – 2011-06-14 14:29:20
另外:我看到沒有理由,這不能成爲一個成員函數。我可能會錯過一些知識。請*幫助我,而不是僅僅批評一切,如果是這樣的話。我認爲它應該是一個成員函數,因爲它可以解釋爲什麼有太多的參數*(根據OP的錯誤信息)。 – 2011-06-14 14:34:00
你需要讓你的運營商一個非成員函數。
+1 Sheesh。由於所有的答案都是錯誤的答案,只有一個答案是正確的,所以我覺得不得不在這裏投票。還有其他所有正確回答此問題的人。 – 2011-06-14 00:26:26
對於爲什麼它不應該是成員函數,我可以有一個很好的解釋嗎?我被教導說,當你想限制它成爲左手邊的「PerfectNum」時是可以的;因爲OP只希望它位於兩個'PerfectNum'對象之間,所以我認爲成員函數是要走的路。 – 2011-06-14 14:32:00
運算符+應該是非成員函數。返回類型應該是const對象。如果你有operator = defined,那麼最好還是定義operator + =。所以,你可以用operator + =來實現operator +。
const PerfectNum operator+(const PerfectNum& lhs, const PerfectNum& rhs)
{
PerfectNum ret(lhs);
ret += rhs;
return rhs;
}
當聲明爲類方法時,重載操作符+肯定不應該是朋友/自由函數。這裏有一個非常簡單的實現:
class PerfectNum {
public:
PerfectNum(int);
PerfectNum(const PerfectNum&);
PerfectNum operator+(const PerfectNum&) const;
private:
int mNumber;
};
PerfectNum PerfectNum::operator+(const PerfectNum& rhs) const
{
return PerfectNum(this->mNumber + rhs.mNumber);
}
這不是類方法嗎?如果你使它成爲PerfectNum的一種方法,那麼你只需要一個參數,並使用「this.thenum」作爲另一個參數。 – sleeves 2011-06-13 22:28:00
這是你從編譯器得到的確切錯誤信息嗎?函數'int operator +(PerfectNum,PerfectNum)'返回太多參數? – Oswald 2011-06-13 22:28:52
沒有編譯器會產生這樣的錯誤信息。在這裏發佈編譯器輸出時請使用複製和粘貼。 – 2011-06-13 22:29:57