当我尝试编译这段代码时,我有一个奇怪的错误。
我会解释我的问题。
我将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。
答案 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 &
。或者,如果您计划更改参数实例,则只需作为参考,即&
。