在C ++中将函数重载为unsigned char和unsigned int导致不明确

时间:2015-04-26 07:19:44

标签: g++ overloading

我必须重载函数:

void wypisz(unsigned int32 x, int n = 1);
void wypisz(unsigned char x, int n = 1);

这里是我提出它们的代码:

main()
{
    wypisz((int32)(32), 7);
    wypisz('a', 7);
    return 0;
}

当我尝试使用G ++编译它时,我收到一个错误:

  

test.cpp:在函数“int main()”中:

     

test.cpp:10:21:错误:重载'wypisz(int, int)'的调用是   含糊不清的wypisz((int)(32), 7);

     

test.cpp:10:21:注意:候选人是:

     

test.cpp:5:6:注意:void wypisz(unsigned int, int) void wypisz(unsigned int x, int n = 1);

     

test.cpp:6:6:注意:void wypisz(unsigned char, int) void wypisz(unsigned char x, int n = 1);

当我删除未签名时,它将编译正常。

有没有办法调用这个方法 - 我应该在call语句中更改?不幸的是,我无法改变声明中的任何内容=他们必须保持原样。

1 个答案:

答案 0 :(得分:2)

问题在于,在您的函数调用中,您正在转换为[{"id":1}, {"id":2,"children":[{"id":3}, {"id":4}, {"id":5,"children":[{"id":6}, {"id":7}, {"id":8} ] }, {"id":9}, {"id":10,"children":[{"id":11,"children":[{"id":12}]}]}]} ] ,它既不是int32也不是unsigned char。实际上,它可以隐式地转换为它们中的任何一个(编译器可以自动转换它)。但是,因为它可以自动将其转换为 ,所以它并不知道转换为,这就是调用不明确的原因。

要明确地调用该方法,只需将其转换为unsigned int32

unsigned int32

现在,编译器不必进行任何隐式转换,因为存在完全匹配。相反,它只是调用正确的函数。