组合问题:运算符'=='和运算符'-'

Gumichan01

尝试编译这段代码时出现一个奇怪的错误。我会解释我的问题。
我定义了一个vector2D,如下所示:

typedef struct LX_Vector2D
{
    float vx;
    float vy;

    LX_Vector2D& operator =(const LX_Vector2D v);  // Defined

} LX_Vector2D;

我还在此向量上定义了两个运算符:

bool operator ==(LX_Vector2D& u,LX_Vector2D& v); // Are u and v equal?
LX_Vector2D operator -(LX_Vector2D& u);          // Get the opposite vector

所有这些重载运算符都已定义。
因此,我在以下代码中测试了这些运算符:

LX_Vector2D u = {3.14,-2.56};
LX_Vector2D expected_vec = {-u.vx,-u.vy};

if(expected_vec == (-u))    // ERROR
    cout << "OK" << endl;
else
    cout << "NO" << endl;

编译此代码时,出现以下错误:
'expected_vec == operator-((*&u))'中的'operator =='不匹配

我对'='和'=='没问题,因为在实现'-'之前我已定义并测试了它们。

但是,当我修改此代码以获取此代码时:

u = -u;
if(expected_vec == u)    // OK

我没有错。我不明白,因为看起来这两段代码在语义上是相同的。

这是运算符'-'的定义

LX_Vector2D operator -(LX_Vector2D& u)
{
    return {-u.vx,-u.vy};
}

所以我的问题是:
为什么我的编译器无法将“ expected_vec ==(-u)”识别带有“ expected_vec”和“ -u”作为参数运算符“ ==”的调用

另一个问题:如果
有可能,我如何可以毫无问题地使用if(expected_vec ==(-u))

我使用g ++ 4.6.1。

一些程序员哥们

这里的问题是,operator-当用作另一个表达式的一部分时,来自的结果是一个临时值,并且operator==需要非恒定引用。非恒定引用不能绑定到临时值。

简单的解决方案?使operator==函数采用常量引用:

bool operator ==(const LX_Vector2D& u, const LX_Vector2D& v)
//               ^^^^^                 ^^^^^
// Note the use of `const`

作为一般建议,在声明不会修改其参数的函数时,请始终将参数作为常量传递。这样可以避免此类问题,并且还可以帮助编译器进行可能的优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章