问题是:
friend bool operator==(const TradeItem& item);
需要两个参数和:
bool TradeItem::operator==(const TradeItem& item)
需要一个论据。
这是因为非会员版本operator==
总是需要两个,而会员版本需要一个。您的朋友声明声明了非成员运算符重载。
class C {
friend bool operator==(const C &lhs, const C &rhs);
public:
bool operator==(const C& rhs);
};
bool operator==(const C &lhs, const C &rhs) { return true; }
bool C::operator==(const C& rhs) { return true; }
此外,如果您需要在左侧允许类型转换,则只需要使用两个成员版本。例如:
bool operator==(int lhs, const C &rhs);
bool operator==(double lhs, const C &rhs);
10 == C();
3.0 == C();
而且您可能无需将这些重载声明为 C 的朋友就可以逃脱。也许是这样的:
class C {
public:
bool operator==(const C& rhs);
bool operator==(int rhs);
bool operator==(double rhs);
};
bool operator==(int lhs, const C &rhs) { return rhs == lhs; }
bool operator==(double lhs, const C &rhs) { return rhs == lhs; }
bool C::operator==(const C& rhs) { return true; }
bool C::operator==(int rhs) { return *this == convert_int_to_C(rhs); }
bool C::operator==(double rhs) { return *this == convert_double_to_C(rhs); }
此外,由于检查相等性不应更改对象,因此您应该const
限定成员函数:
class C {
bool operator== (C const &rhs) const;
}