【问题标题】:Overloading comparison operator重载比较运算符
【发布时间】:2012-08-19 20:47:55
【问题描述】:

我对 C++ 还很陌生,并试图在类中重载

在我的头文件中,我有:

friend bool operator<(const Tweet& a, const Tweet& b);

在我的类文件中:

inline bool Tweet::operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

目前我收到一个错误‘bool Tweet::operator&lt;(const Tweet&amp;, const Tweet&amp;)’ must take exactly one argument

删除Tweet:: 会将错误更改为未定义的引用,删除第二个参数会将错误更改为“必须完全采用两个参数”

PS - 我已经尝试按照Operator overloading 中的相应部分以及一些相关问题进行操作,但后来我得到了各种不同的错误。

【问题讨论】:

  • 请注意,由于该函数是友元函数,它应该能够获取私有成员,因此除非我没有看到任何内容,否则不需要获取器。

标签: c++ operator-overloading


【解决方案1】:

好吧,您将一个独立函数声明为友元,然后定义一个类成员函数作为比较。这不完全正确。

如果定义比较运算符有两个参数,则必须将其声明为静态:

static bool Tweet::operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

这样a &lt; b 会被解释为Tweet::operator&lt;(a, b);。

如果没有static,您会隐含地获得 3 个参数:*this、a 和 b。

或者,您可以定义一个实例运算符,采用一个参数并将其与当前实例进行比较:

bool Tweet::operator<(const Tweet& b) {
    return (getID() < b.getID());
}

这样a &lt; b 会被解释为a.operator&lt;(b);。

或者,您可以定义一个独立的函数(这是您实际可能需要friend的地方):

bool operator<(const Tweet& a, const Tweet& b) {
    return (a.getID() < b.getID());
}

这样a &lt; b 会被解释为operator&lt;(a, b);。

哪一种都好。

【讨论】:

  • 谢谢,您的第二个建议给出了关于丢弃限定符的错误,但第三个选项似乎效果很好(看来我需要做的就是从我的原始文件中删除 inline 修饰符和 Tweet::代码)
  • @Exupery:不客气!好吧,要使第二个建议起作用,也许您需要 getID 成为 const 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2011-03-07
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多