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