不匹配'operator-'

时间:2017-01-03 18:59:54

标签: 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类的公共成员

该课程用作:

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

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

提前致谢!

2 个答案:

答案 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左侧参数。