c++ - 不匹配 ‘operator-’

标签 c++ operator-overloading

自从我更改编译器以来已经有一段时间了,但是当我更改时,我之前运行良好的代码无法再编译 - 我将此归因于 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的公共(public)成员

该类用作:

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 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 并返回它。但是,复制省略不适用于参数对象,因为它适用于局部变量。复制省略对于这样的运算符非常重要,因为它减少了程序需要初始化的对象数量。所以你可以试试这个来提高性能:

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

关于c++ - 不匹配 ‘operator-’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41450529/

相关文章:

c++ - 对具有重载运算符的类型进行就地销毁->

oop - MATLAB 是否支持 "callable"(即类函数)类?

C++ MFC MDI 在创建时更改子窗口变量

c++ - 什么是 RDS 或可靠数据报套接字

c++ - 为什么这个交换函数调用不明确?

c++ - 将 'system::string' 传递给函数时出错

c++ - 重载运算符delete而不重载new时,什么是正确的行为? gcc 和 clang 不同

c++ - 如何使用 `Function Call Operator` 将 `rvalue` 类型加载到我的对象?

c++ - 从 boost::spirit 解析器中检索 AST

c++ - 为什么要在最后放一个 "const"?