组合问题:运营商' =='和运营商' - '

时间:2015-11-07 20:41:56

标签: c++ operator-overloading

当我尝试编译这段代码时,我有一个奇怪的错误。 我会解释我的问题。
我将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 ==运算符 - ((*&amp; u))中'运算符=='不匹配'

我没有问题&#39; =&#39;和&#39; ==&#39;因为我在实施&#39; - &#39;。

之前定义并测试了它们

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

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

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

以下是运营商的定义&#39; - &#39;

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

所以我的问题是:
为什么我的编译器不会将'expected_vec ==( - u)'识别为运算符&#39; ==&#39; expected_vec 和( - u)作为参数?

另一个问题:
如果可能的话,我怎样才能使用 if(expected_vec ==( - u))而没有任何问题?

我使用g ++ 4.6.1。

3 个答案:

答案 0 :(得分:4)

这里的问题是operator-作为另一个表达式的一部分使用时的结果是临时值,而operator==采用非常量引用。非常量引用不能绑定到临时值。

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

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

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

答案 1 :(得分:3)

运算符-返回一个临时对象:

LX_Vector2D operator -(LX_Vector2D& u)

,而您的比较运算符接受非const引用:

bool operator ==(LX_Vector2D& u,LX_Vector2D& v)

-运算符返回的临时对象不能用作非const引用。这是不允许的,因为无论如何都无法修改即将超出范围的对象,因此编译器确保您甚至不尝试它。

作为一般规则,您应该使任何不修改其参数的函数改为const引用,尤其是比较函数:

bool operator ==(const LX_Vector2D& u,const LX_Vector2D& v)

答案 2 :(得分:0)

除了其他答案之外,您的分配操作员还应该使用const&,如下所示:

LX_Vector2D& operator =(const LX_Vector2D& v)

请注意参数类型后的&

作为一般规则,并且为了避免构造不必要的对象副本,如果您不打算更改参数实例,则复杂类型的参数几乎应始终为const &。或者,如果您计划更改参数实例,则只需作为参考,即&