重载的运算符类型错误

时间:2015-09-27 00:34:01

标签: c++ function class operator-overloading operators

我创建了一个Money类,它使用以下函数将Money转换为其值的百分比。我正在尝试创建一个重载运算符来完成相同的操作,但是我在下面的重载运算符中得到Error: Expression must have integral or unscoped enum type scaledCents;他们是完全相同的。怎么修改?提前谢谢。

Money Money::percent(const Money& amount, double percentage) const {
    int amountToCents = amount.getCents() + amount.getDollars() * 100;
    double pScaledMoney = amountToCents * percentage;
    int scaledDollars = abs((round(fabs(pScaledMoney / 100))) / 100);
    int scaledCents = abs((round(fabs(pScaledMoney / 100))) % 100);
    if (pScaledMoney < 0) {
        scaledDollars = -scaledDollars;
        scaledCents = -scaledCents;
    }
    return Money(scaledDollars, scaledCents);
}

重载运算符:

const Money operator %(const Money& amount, double percentage) {
    int amountToCents = amount.getCents() + amount.getDollars() * 100;
    double pScaledMoney = amountToCents * percentage;
    int scaledDollars = abs((round(fabs(pScaledMoney / 100))) / 100);
    int scaledCents = abs((round(fabs(pScaledMoney / 100))) % 100);
    if (pScaledMoney < 0) {
        scaledDollars = -scaledDollars;
        scaledCents = -scaledCents;
    }
    return Money(scaledDollars, scaledCents);
}   

1 个答案:

答案 0 :(得分:0)

round()的返回值具有浮点类型。数值运算符%不能与双精度数或浮点数一起使用:

// error
(round(fabs(pScaledMoney / 100))) % 100
// fixed
((int)round(fabs(pScaledMoney / 100))) % 100

如果您担心遗嘱的丢失,最好使用返回整数的round函数版本以避免C++: How to round a double to an int?http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1之类的问题。 text-align

C99和C ++ 11具有您需要的确切功能:

long int lround (double x);

其他代码样式问题(与错误无关)

您的两个函数不使用Money的任何私有成员,因此它们都不应该是朋友或类memeber。两者都可以在课外定义。

如果返回一个新对象,从函数返回const Money是没有意义的。