我在自己的Bignum标题中使用了运算符重载,并且存在一些运算符优先级问题。
编译器说我做bignum + int时有一些错误。 (我的Bignum班级名称是'bignum'。不要介意)
这是我的班级定义:
operator long long(void) const {
return atoll(num.c_str());
}
operator +(bignum b) {
//c=this+b
return c;
}
以下是错误发生的情况:
bignum a(1);
int b=1;
bignum c = a+b; //this is the case
错误
第7行:智能感知:“+”不止一个运营商是 与操作数一致。
内置运算符“算术+ 算术“
函数”minary :: bignum :: operator +(minary :: bignum b)“
操作数格式是minary :: bignum + INT。 c:\ Users \ Secret \ Documents \ Visual Studio 2013 \ Projects \ Calculator \ Calculator \ Source.cpp 11 3计算器
提前致谢。
答案 0 :(得分:1)
最简单的方法是转换为整数explicit
:许多隐式转换无论如何都会导致问题。有时隐式转换是有用的,但如果你想处理混合类型算术,它们往往比帮助更多的问题:
class bignum {
// ...
explicit operator long long() const { ... }
// ...
};
使转换运算符explicit
成为C ++ 11的一项功能。您的类似乎也有从整数类型到bignum
的隐式转换,即相应的构造函数。在C ++ 11之前,您只能构建这些构造函数explicit
。这可能是处理歧义的另一种选择,但它会产生转换为long long
和内置整数加法的效果。我猜您希望bignum
作为结果,要求没有合适的转换为整数类型。
请注意,问题是 nothing 与操作符优先级无关:对于任何给定的表达式,编译器确定哪些重载最合适(粗略地说:需要最少量的隐式转换)。如果它找到多个同样好的候选人,那么它会认为程序含糊不清,并要求解决歧义。