我对运算符的重载有点问题。我有一个名为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))))’
我似乎对操作员*声明做错了,但我不明白我做错了什么。
有谁能告诉我如何纠正这个错误?
感谢您的回复。
答案 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
可以在y
是AtmosphericData
类型的对象的情况下工作。
如果您希望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*blah
和2*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
}