我创建了一个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);
}
答案 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
是没有意义的。