c ++重载==运算符需要一个和两个参数

Tyl*_*zen 1 c++ overloading operator-keyword

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

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

bool TradeItem::operator==(const TradeItem& item)
Run Code Online (Sandbox Code Playgroud)

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

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

bool TradeItem::operator==(const TradeItem& i1, TradeItem& i2)
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时它告诉我它只需要一个参数....谈论给我一个解决方法.有谁知道什么出错了?

bam*_*s53 6

问题是:

friend bool operator==(const TradeItem& item);
Run Code Online (Sandbox Code Playgroud)

需要两个参数和:

bool TradeItem::operator==(const TradeItem& item)
Run Code Online (Sandbox Code Playgroud)

需要一个论点.

这是因为非成员版本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; }
Run Code Online (Sandbox Code Playgroud)

如果您需要在左侧允许类型转换,您也只需要使用两个成员版本.例如:

bool operator==(int lhs, const C &rhs);
bool operator==(double lhs, const C &rhs);

10 == C();
3.0 == C();
Run Code Online (Sandbox Code Playgroud)

并且您可以在不将这些重载声明为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); }
Run Code Online (Sandbox Code Playgroud)

此外,由于检查相等性不应更改对象,因此您应该const限定成员函数:

class C {
    bool operator== (C const &rhs) const;
}
Run Code Online (Sandbox Code Playgroud)