我一直试图建立一个小型库来处理大整数,就像练习一样,但我没有明显的理由得到这个错误:
使用重载运算符'+'是不明确的(操作数类型'BigNum :: BigInt'和'int')
这是类定义:
namespace BigNum {
class BigInt {
public:
BigInt();
BigInt(int64_t n);
BigInt(std::string s);
friend std::istream& operator>> (std::istream& in, BigInt& n);
friend std::ostream& operator<< (std::ostream& out, BigInt n);
friend bool operator< (const BigInt& a, const BigInt& b);
friend bool operator> (const BigInt& a, const BigInt& b);
friend bool operator== (const BigInt& a, const BigInt& b);
friend bool operator!= (const BigInt& a, const BigInt& b);
friend bool operator<= (const BigInt& a, const BigInt& b);
friend bool operator>= (const BigInt& a, const BigInt& b);
operator bool();
explicit operator int();
friend void swap (BigInt& a, BigInt& b);
friend BigInt operator+ (BigInt a, BigInt b);
private:
std::vector<int> digits;
std::size_t number_of_digits;
};
}
Run Code Online (Sandbox Code Playgroud)
这些是使用的方法:
BigNum::BigInt::BigInt(int64_t n) {
if (n == 0) {
BigInt();
return;
}
// The number is stored in reverse
for (; n; n /= 10)
digits.emplace_back(n % 10);
number_of_digits = digits.size();
}
std::ostream& BigNum::operator<< (std::ostream& out, BigNum::BigInt n) {
for (auto it = n.digits.rbegin(); it != n.digits.rend(); ++it)
out << *it;
return out;
}
void BigNum::swap (BigNum::BigInt& a, BigNum::BigInt& b) {
BigNum::BigInt temp(a);
a = b;
b = temp;
}
BigNum::BigInt BigNum::operator+ (BigNum::BigInt a, BigNum::BigInt b) {
if (a < b)
BigNum::swap(a, b);
BigNum::BigInt result(a);
int transport = 0;
for (std::size_t i = 0; i < b.number_of_digits; ++i) {
result.digits[i] += b.digits[i] + transport;
transport = result.digits[i] / 10;
result.digits[i] %= 10;
}
if (transport)
result.digits.emplace_back(transport);
++result.number_of_digits;
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果我写的东西如下:
BigNum::BigInt a = 2;
BigNum::BigInt b = a + 1;
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误.我已经明确地使用了int类型,但它并没有帮助.我也不想让构造函数显式化,因为这意味着我将不再能够为BigInt分配一个int(就像我在前面的例子中所做的那样).我怎样才能解决这个问题?
拥有一个显式转换运算符是不够的,您需要确保每次转换为内置类型都是显式的.特别是,你应该试试
explicit operator bool();
Run Code Online (Sandbox Code Playgroud)
防止a + 1匹配转换然后促销序列(int)(bool)a和调用operator+(int, int).