将整数隐式转换为类'BigInt'

时间:2013-12-11 13:33:21

标签: c++ casting int

我已经创建了这个类BigInt,并且它派生了转换构造函数,例如

BigInt::BigInt(int l):InfInt(l){}

然而,当我做这样的事情时:

for(i=0;BigInt::pow(2,i+1)<exponent;i++);

编译器对我大喊:

error: ambiguous overload for ‘operator+’ (operand types are ‘BigInt’ and ‘int’)

我知道解决这个问题的一个简单方法就是在所有内容之前添加(BigInt),如下所示:

for(i=0;BigInt::pow(2,i+(BigInt)1)<exponent;i++);

但是这段代码看起来很难看,有点难以阅读,并且很难打字。有没有办法告诉编译器立即执行此操作(如标题所示)?如果没有,那就不太戏剧化了。
哦,对不起,如果已经问过这个问题,但是我已经尝试在google上搜索我自己的解决方案了,并且找不到任何可以帮助我的方法。 (我几乎能够找到关于operator int()之类的东西,我已经知道了。)

2 个答案:

答案 0 :(得分:6)

你还有一个operator int(),不是吗?那,加上采用int的构造函数会产生歧义。编译器可以通过将BigInt::operator+()参数转换为int来调用BigInt,也可以通过将+对象转换为BigInt来调用内置int operator int()。标记explicit BigInt以消除这种歧义。这将导致在少数情况下转换失败,可以通过添加强制转换来解决。这是你能做的最好的事情;没有转换优先规则可以使编译器将{{1}}视为最大的整数类型。

答案 1 :(得分:0)

不确定问题是什么。比较这个帮助:

#include <iostream> 

struct MyInt
{
    MyInt(int i) : m_i(i) {}
    MyInt operator+(const MyInt& myint) const
    {
        return MyInt(m_i+myint.m_i);
    }     
    int m_i;
};     

int main()
{
    MyInt a(10);
    MyInt b(5);
    MyInt c1 = a + b;
    MyInt c2 = a + 5;

    std::cout << c1.m_i << std::endl;
    std::cout << c2.m_i << std::endl;

    return 0;
}