与“运算符-”不匹配

no match for ‘operator-’

本文关键字:运算符 不匹配      更新时间:2023-10-16
自从

我更改编译器以来已经有一段时间了,但是当我这样做时,我以前运行良好的代码无法再编译 - 我将其归因于最近C++语言标准的细微变化(没有太密切地遵循它们)。

还行。曾经工作的代码是:

VECTOR operator-(const VECTOR& v){  
    VECTOR tmp;
    tmp.x = x - v.x;
    tmp.y = y - v.y;
    tmp.z = z - v.z;
    return tmp;
}

这里,x,y,z都是VECTOR类的公共成员。

该类用作:

VECTOR diff, A, B; 
diff = A - B;

使用 g++6.2.0 编译它时,出现错误:

error: no match for ‘operator-’ (operand types are ‘const VECTOR’ and ‘const VECTOR’)

我遵循了在线找到的各种示例(包括此处),并通过 friend 函数实现了运算符重载:

friend VECTOR operator-(VECTOR lhs, const VECTOR& rhs){  
    lhs.x -= rhs.x;
    lhs.y -= rhs.y;
    lhs.z -= rhs.z;
    return lhs;
}

这段代码编译得很好。我看到了使用朋友函数的基本原理,但我想知道为什么旧的(成员函数)实现不起作用以及如何对其进行编译。

提前感谢!

成员当然应该const合格,如

VECTOR operator-(const VECTOR& v) const {
                                  -----

该问题不会影响您的特定示例,但当您减去 const VECTOR 时,它可能会导致某处出现问题。


此外,friend签名有点不稳定。几年前有一段短暂的时期,人们普遍建议按价值传递LHS并将其返回。但是,复制 elision 不适用于参数对象,就像它不适用于局部变量一样。复制 elision 对于这样的运算符非常重要,因为它减少了程序需要初始化的对象数量。因此,您可以尝试这样做以提高性能:

friend VECTOR operator-(const VECTOR& lhs, const VECTOR& rhs){  
    VECTOR tmp;
    tmp.x = lhs.x - rhs.x;
    tmp.y = lhs.y - rhs.y;
    tmp.z = lhs.z - rhs.z;
    return tmp;
}

问题是成员函数需要是常量

VECTOR operator-(const VECTOR& v) const {  
                                  ^^^^^

否则,运算符不能应用于左侧const参数。