c++ - 组合问题 : operator '==' and operator '-'

标签 c++ operator-overloading

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

typedef struct LX_Vector2D
{
    float vx;
    float vy;

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

} LX_Vector2D;

我还在这个 vector 上定义了两个运算符:

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_vecoperator '==' 的调用em>(-u) 作为参数?

另一个问题:
如果可能的话,我怎样才能毫无问题地使用 if(expected_vec == (-u))

我使用 g++ 4.6.1。

最佳答案

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

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

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

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

关于c++ - 组合问题 : operator '==' and operator '-' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587545/

相关文章:

c++ - 递归反转没有全局变量的链表

c++ - 尝试在重载函数中获取字符和字符串的输入

c++ - set 和 multiset 只是一个谓词不同吗?

c++ - 用DIPlib测量垫圈

C++ 模板重载

c++ - 将自定义工具添加到工具链以在编译前删除 UTF-8 BOM

c++ - 如何重载 + 运算符(友好),以便可以将数组元素的值添加到类对象的字段中?

xcode - 数字的 Swift 算术和比较运算符重载列表?

c++ - 无法使用对象访问迭代器数据成员

c++ - 在 C++ 中重载增强赋值(返回类型)