【问题标题】:operator== in C++ struct [duplicate]C++结构中的运算符== [重复]
【发布时间】:2021-11-05 02:55:31
【问题描述】:

我正在尝试在结构中定义 == 运算符:

typedef struct _tBScan {
    QString strQuadpackNumbers;
    uint uintBegin, uintEnd;
    bool operator==(const struct _tBScan& a, const struct _tBScan& b) {
        return (a.strQuadpackNumbers.compare(b.strQuadpackNumbers) == 0 &&
                a.uintBegin == b.uintBegin && a.uintEnd == b.uintEnd);
    }
} tBScan;

这不会编译,我明白了:

C2804: binary 'operator ==' has too many parameters
C2333: '_tBScan::operator ==' error in function: declaration: skipping function body

我使用的是 Qt 5.9.2 和 MSVC 2015,我需要定义它以便使用 QList 比较函数。

【问题讨论】:

  • 使其成为非成员函数。除了这两个参数之外,成员函数还需要调用一个实例。
  • @songyuanyao,你能解释一下吗,它必须定义为结构中的一个方法,就像它在QList中使用的那样
  • @SPlatten 它不必是成员,除非 QList 出于某些邪恶原因使用 x.operator==(y) 而不是 x == y
  • @SPlatten 但它并不要求它是成员函数。这个纲要可能值得一读:stackoverflow.com/questions/4421706/…
  • C++ 中不需要typedef struct ss {} sss

标签: c++ operator-keyword


【解决方案1】:

将二元运算符重载为成员函数时,第一个参数是this 指针。在您定义operator== 的签名中,它将采用3 个参数。但是,它只能占用两个。

在您的情况下,我建议将其设为非成员函数。

typedef struct _tBScan {
    QString strQuadpackNumbers;
    uint uintBegin, uintEnd;
} tBScan;

bool operator==(const struct _tBScan& a, const struct _tBScan& b) {
        return (a.strQuadpackNumbers.compare(b.strQuadpackNumbers) == 0 &&
                a.uintBegin == b.uintBegin && a.uintEnd == b.uintEnd);
}

当您重载 operator@ 时,表达式 _tBScan @ _smt 被解析为。

_tBScan.operator@(_smt);

当它不是成员函数时,表达式被解析为

operator@(_tBScan, _smt);

因此编译器会搜索其中任何一个的重载。

【讨论】:

  • 如果不是结构体的方法,“this”与操作符的关系如何定义?
  • @SPlatten 查看编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多