【问题标题】:Implicitly convert integers to class 'BigInt'将整数隐式转换为“BigInt”类
【发布时间】:2013-12-11 13:33:20
【问题描述】:

我已经创建了这个类 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++);

但是这段代码看起来很难看,有点难读,而且打字很痛苦。有没有办法告诉编译器立即执行此操作(如标题所述)?如果没有的话,也不会太戏剧化。
哦,如果已经问过这个问题,请原谅,但我试图在谷歌和这里自己寻找解决方案,但没有找到任何可以帮助我的解决方案。 (我主要能找到关于operator int() 之类的东西,我已经知道了)。

【问题讨论】:

  • 为什么不提供一个以int 为参数的operator+ 的重载?
  • 或采用int的构造函数。
  • @Nim 因为我必须对每种类型都这样做,我想知道是否有更聪明的方法。
  • 不,你不需要,你可以将int 添加到BigInt,我原以为会是这样......你还想添加什么?如果是这样,您可以添加选择性支持..
  • @BoBTFish 我有一个,我在帖子的第一行中提到了它。还是您在谈论不同类型的构造函数?

标签: c++ casting int


【解决方案1】:

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

【讨论】:

  • 哦,谢谢,太好了,我现在明白了,谢谢。
  • 有时那些失败的转换实际上是有用的,甚至。例如,您不小心将BigInt 传递给了某个函数,该函数具有针对不同类型的多个重载,假设它具有BigInt 重载,而实际上它没有(也许它应该是,但您还没有编写它)。如果它隐式转换为int,那么编译器将默默地使用它。这就像您通过启用 -Werror -Wconversion 获得的 long long 一样。
【解决方案2】:

不确定是什么问题。与此进行比较是否有帮助:

#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;
}

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多