自从我更改了编译器以来已经有一段时间了,但是当我这样做时,我之前运行良好的代码不能再编译了 - 我将其归因于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 VECTOR operator-(VECTOR lhs, const VECTOR& rhs){
lhs.x -= rhs.x;
lhs.y -= rhs.y;
lhs.z -= rhs.z;
return lhs;
}
这段代码编译得很好。我看到了使用友元函数的基本原理,但我想知道为什么较旧的(成员函数)实现不起作用以及如何编译它。
提前致谢!
答案 0 :(得分:3)
该成员当然应该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;
}
答案 1 :(得分:2)
问题是成员函数需要是const
VECTOR operator-(const VECTOR& v) const {
^^^^^
如果没有这个,操作符就不能应用于const
左侧参数。