gpt4 book ai didi

c++ - 不匹配 ‘operator-’

转载 作者:行者123 更新时间:2023-11-30 01:08:47 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com