【问题标题】:C++ Operator Overloading in expression表达式中的 C++ 运算符重载
【发布时间】:2011-09-16 16:38:36
【问题描述】:

我确定这已经在某个地方得到了回答,但我不知道要搜索什么。

我有以下情况。我创建了一个 Vector 类并重载了“*”(乘以 escalar)和“+”运算符(添加两个向量)。现在,以下代码行:

Vector sum = (e_x*u_c) + (e_y*u_r);

这给了我以下错误:

error: no match for 'operator+' in '((Teste*)this)->Teste::e_x.Vector::operator*(u_c) + ((Teste*)this)->Teste::e_y.Vector::operator*(u_r)'

但是,如果我将这个错误行替换为:

Vector aux = (e_x*u_c);
Vector aux2 = (e_y*u_r);
Vector sum = aux + aux2;

我完全没有错误。为什么?这两个表达式不是等价的吗?

编辑: 以下是我对“*”和“+”的定义:]

Vector Vector::operator+(Vector& right)
{
    return Vector(x + right.x, y + right.y, z + right.z);
}
double Vector::operator*(Vector& right)
{
    return this->scalar_product(right);
}

【问题讨论】:

  • 你能告诉我们运算符重载的定义吗?
  • 是的。我会把它添加到问题中
  • e_x 和 e_y 是 Vector 类型,对吧?

标签: c++ expression overloading operator-keyword


【解决方案1】:

声明不正确。

T T::operator +(const T& b) const;​

T T::operator *(const T& b) const;

Operators in C and C++

【讨论】:

    【解决方案2】:

    Vector& right 替换为const Vector& right

    表达式(e_x*u_c) 是一个右值,对非常量的引用不会绑定到右值。

    此外,成员函数本身也应标记为const

    Vector Vector::operator+(const Vector& right) const
    {
        return Vector(x + right.x, y + right.y, z + right.z);
    }
    
    double Vector::operator*(const Vector& right) const
    {
        return this->scalar_product(right);
    }
    

    scalar_product 也必须标记为const。阅读更多关于 const 正确性here

    【讨论】:

    • 啊对!现在这100%有意义!它不能将运算符应用于右值,因为我可以更改它(没有 const 关键字)感谢修复和解释!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多