【发布时间】:2013-03-20 19:43:20
【问题描述】:
我有一个进行十进制计算的课程。我有所有的数学运算符重载。它适用于相当简单的计算,但当我需要添加括号时会失败。例如,以下两种计算都可以工作并得到正确的结果:
myClass r, a = 100000, b = 2.5, c = 10, d = 30;
r = c / d * a * b;
r = (c / d) * a * b;
但如果我将计算更改为 r = a * b * (c / d); 编译失败:
error: no match for ‘operator*’ in ‘myClass::operator*(myClass&)((* & b)) * myClass::operator/(myClass&)((* & d))’ in gcc 4.6.2.
我可能遗漏了一些简单的东西,但找不到。我做错了什么?
【问题讨论】:
-
我们缺少一些简单的东西:带有操作符的代码。
-
我看着我的水晶球,我看到:你的
operator*或operator/要么不是const,要么它缺少const参数。 (注意:这是一个完全疯狂的猜测,实际上我们需要您的运营商的签名才能有机会做任何事情,而不是进行疯狂的猜测) -
您确定您的
operator/将const reference返回到结果实例吗? -
确保将
const reference返回到本地结果似乎是一件“确保”很奇怪的事情。 -
通常,数学运算符被实现为调用成员函数的函数。例如,函数
*将调用成员*=。通过这种方式,编译器可以对隐式类型转换做出更好的决策。这可能与您的问题有关,但仅凭您的示例很难判断。
标签: c++ operator-overloading operator-precedence