重载运算符错误*

时间:2011-09-02 14:42:06

标签: c++ operator-overloading

我对运算符的重载有点问题。我有一个名为AtmospheridData的类,我在其中定义了运算符*。

在标题中我在类中定义了这个方法:

//! Operator * (scalar)
AtmosphericData operator*(const qreal& qrMult) const;

,.cpp文件中的定义如下:

AtmosphericData AtmosphericData::operator*(const qreal& qrMult) const
{
    AtmosphericData xResult;

    xResult.m_qrTemperature        = this->m_qrTemperature * qrMult;
    xResult.m_qrPressure           = this->m_qrPressure * qrMult;
    xResult.m_qrDensity            = this->m_qrDensity * qrMult;
    xResult.m_qrAbsoluteHumidity   = this->m_qrAbsoluteHumidity * qrMult;
    xResult.m_qrVisibility         = this->m_qrVisibility * qrMult;
    xResult.m_qrPrecipitationIndex = this->m_qrPrecipitationIndex * qrMult;
    xResult.m_xWind.qrNS           = this->m_xWind.qrNS * qrMult;
    xResult.m_xWind.qrEW           = this->m_xWind.qrEW * qrMult;
    xResult.m_xWind.qrVert         = this->m_xWind.qrVert * qrMult;

     xResult.m_xPrecipitationType = this->m_xPrecipitationType;

     return xResult;
}

然后,我使用以下表达式中的类:

AtmosphericData c2;
AtmosphericData t1;
AtmosphericData t2;
AtmosphericData y0;
AtmosphericData y1;
qreal           hx;

/* other code */

c2 = - (3 * (y0 - y1) + (hx * ((2 * t1) + t2))) / (hx * hx);

当我编译(在linux下使用qmake-gcc)时,我得到以下错误

error: no match for ‘operator*’ in ‘3 * AtmosphericData::operator-(const AtmosphericData&) const(((const AtmosphericData&)((const AtmosphericData*)(& y1))))’

我似乎对操作员*声明做错了,但我不明白我做错了什么。

有谁能告诉我如何纠正这个错误?

感谢您的回复。

5 个答案:

答案 0 :(得分:4)

C ++中的算术运算符不是自动交换的,因此只有在执行AtmosphericData * qreal时操作符才会启动,而不是在类型的排序相反时(3 * (y0 - y1)中发生的情况)表达)。

你还必须写一个operator*来处理qreal * AtmosphericData个案,必须把它写成一个自由函数,因为左手操作数的类型不是你班级的类型。 / p>

inline AtmosphericData operator*(const qreal& lhs, const AtmosphericData & rhs)
{
    // Just forward to the other operator (this works because I swapped the operands)
    return rhs * lhs;
}

顺便说一句,恕我直言要实现数学运算符,你应该遵循首先实现赋值版本(*=)的通常模式,然后从“普通”(*)调用它们版;有关详细信息,请参阅operator overloading FAQ

答案 1 :(得分:0)

如果你写:

c2 = - ((y0 - y1) * 3 + (hx * ((t1 * 2 ) + t2))) / (hx * hx);

而不是

c2 = - (3 * (y0 - y1) + (hx * ((2 * t1) + t2))) / (hx * hx);

然后它应该工作。因为代码中operator*的定义要求AtmosphericData类型的对象应位于*的左侧。也就是说,3 * y不起作用,但y*3可以在yAtmosphericData类型的对象的情况下工作。

如果您希望3*y也能正常工作,请将非会员功能定义为:

AtmosphericData operator*(const qreal &r, const AtmosphericData& a)
{
   return d*r;//call the other overloaded, or calculate the value here if you wish!
}

我建议您将其他功能定义为非成员功能。如果需要访问私人或受保护的成员,请将其设为friend。否则,非会员非朋友应该是您的首选。

答案 2 :(得分:0)

您正在尝试将AtmostphereicData乘以int(3*blah2*blah),这个操作似乎没有定义。

定义一个运算符,该运算符采用AtmosphereicData的int和right的左侧。

答案 3 :(得分:0)

您已定义operator *,其第一个参数为AtmosphericData,第二个参数为数字。但反之亦然。

您也应该定义另一个运算符(作为非成员)

AtmosphericData operator * (qreal num, const AtmosphericData& ad )
{
    return ad*num;
}

答案 4 :(得分:0)

如果您在班级中声明操作员,则只有在左侧上使用您的班级时才会有效。要在右侧使用您的类,您还需要将操作符作为自由函数重载:

AtmosphericData operator*(const qreal& qrMult, const AtmosphericData& data);

您还可以使用Boost.Operators并使用operator*=免费获取所有这些内容。

class AtmosphericData : boost::multipliable<AtmosphericData, qreal> 
{

   // blah

public:
    AtmosphericData& operator*=(const qreal& qrMult) {
        // blah blah
        return *this;
    }
    // by inheriting from boost::multipliable, this gives you both operator* for free
}