在 C++ 中将函数重载为 unsigned char 和 unsigned int 会导致歧义

Overloading function in C++ as unsigned char and unsigned int result in ambiguous

我必须重载函数:

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: In function 'int main()':

test.cpp:10:21: error: call of overloaded 'wypisz(int, int)' is ambiguous wypisz((int)(32), 7);

test.cpp:10:21: note: candidates are:

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

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

当我删除 unsigned 时它会正常编译。

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

问题是,在您的函数调用中,您正在转换为 int32,它既不是 unsigned char 也不是 unsigned int32。事实上,它可以隐式转换为它们中的任何一个(编译器可以自动转换它)。但是,因为它可以自动将其转换为 either,所以它不知道将其转换为 which,这就是调用不明确的原因.

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

wypisz((unsigned int32)32, 7);

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