【问题标题】:c++ overloaded ==operator wants one AND two argumentsc++ 重载 ==operator 需要一个 AND 两个参数
【发布时间】:2013-03-10 01:48:19
【问题描述】:

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

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)

但是当我编译它时它告诉我它只需要一个参数....谈论给我解决方案。有谁知道怎么回事?

【问题讨论】:

  • 你必须同时创建一个带有一个参数的函数和一个带有 2 个参数的函数;)

标签: c++ overloading operator-keyword


【解决方案1】:

问题是:

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;
}

【讨论】:

  • 只需添加一个说明,即提出问题的人可能会觉得有用:您可能只需要其中一个。除非在极端情况下,声明(和实施)这两者都是多余的。如果将此运算符编写为成员函数,则不需要朋友声明,也不需要它的双参数版本。
  • 程序指南告诉我它需要是朋友超载,所以我要摆脱成员超载。感谢您的帮助。
  • 我还建议您研究 boost::operator 以简化操作符重载的处理。此外,如果您有运算符的成员函数版本,您很可能不需要使用朋友声明
  • @YaserZhian 如果两个都写,不会导致编译错误吗?我想我可以尝试确认一下。如果您有一个同时作为成员和朋友重载的运算符,编译器或链接器似乎将无法决定调用哪个。
  • @Code-Guru 当然,如果您正确且相同地编写两个版本(即都使用const &)和两个声明,它会产生编译错误(它会说运算符不明确)从调用站点可见,您实际上是从某个地方调用相等运算符。如果不满足这些条件,例如如果你还没有真正调用操作符,你的类将编译(我认为)但你以后会遇到问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      运算符== 的类成员版本接受一个参数,而友元版本接受两个参数,所以应该是这样的:

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多