1

我正在尝试在我正在做的项目中重载 == 运算符。声明和定义是:

friend bool operator==(const TradeItem& item);

bool TradeItem::operator==(const TradeItem& item)

当我编译它时,它说:'bool operator==(const TradeItem&)' 必须正好有两个参数。所以我修改它有两个这样的论点:

friend bool operator==(const TradeItem& i1, TradeItem& i2);

bool TradeItem::operator==(const TradeItem& i1, TradeItem& i2)

但是当我编译它时,它告诉我它只需要一个论点....谈论给我解决办法。有谁知道出了什么问题?

4

4 回答 4

6

问题是:

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;
}
于 2013-03-10T01:51:21.917 回答
3

请记住,这==是一个二元运算符。这意味着它必须始终有两个参数。如果您operator==()作为成员函数重载,则其中一个参数this是传递给每个成员函数的隐式参数。

在您的代码中,您声明了一个属于该类的全局operator==()函数。同时,您将 a 定义为的成员。选一个; 你不应该两者都做。friendTradeItemoperator==()TradeItem

于 2013-03-10T01:51:00.133 回答
0

operator 的类成员版本==有一个参数,而友元版本有两个参数,所以它应该是这样的:

friend bool operator==(const TradeItem& i1, TradeItem& i2);

bool TradeItem::operator==(const TradeItem& i )    

这是因为成员版本有一个隐藏的this参数。会员版也将优先于朋友版。您应该选择其中之一。

于 2013-03-10T01:51:02.523 回答
0

接受两个参数的 operator== 重载不能是成员函数 - 将其声明为bool operator==(const T&, const T&).

于 2013-03-10T01:51:04.590 回答