操作员优先级与操作员过载

时间:2015-01-10 10:34:17

标签: c++

我在自己的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计算器

提前致谢。

1 个答案:

答案 0 :(得分:1)

最简单的方法是转换为整数explicit:许多隐式转换无论如何都会导致问题。有时隐式转换是有用的,但如果你想处理混合类型算术,它们往往比帮助更多的问题:

class bignum {
    // ...
    explicit operator long long() const { ... }
    // ...
};

使转换运算符explicit成为C ++ 11的一项功能。您的类似乎也有从整数类型到bignum的隐式转换,即相应的构造函数。在C ++ 11之前,您只能构建这些构造函数explicit。这可能是处理歧义的另一种选择,但它会产生转换为long long和内置整数加法的效果。我猜您希望bignum作为结果,要求没有合适的转换为整数类型。

请注意,问题是 nothing 与操作符优先级无关:对于任何给定的表达式,编译器确定哪些重载最合适(粗略地说:需要最少量的隐式转换)。如果它找到多个同样好的候选人,那么它会认为程序含糊不清,并要求解决歧义。