"使用operator +是不明确的",尽管类型转换被声明为显式

Sem*_*etg 2 c++ oop

我一直试图建立一个小型库来处理大整数,就像练习一样,但我没有明显的理由得到这个错误:

使用重载运算符'+'是不明确的(操作数类型'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(就像我在前面的例子中所做的那样).我怎样才能解决这个问题?

Ben*_*igt 8

拥有一个显式转换运算符是不够的,您需要确保每次转换为内置类型都是显式的.特别是,你应该试试

explicit operator bool();
Run Code Online (Sandbox Code Playgroud)

防止a + 1匹配转换然后促销序列(int)(bool)a和调用operator+(int, int).