在 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);
现在,编译器不必进行任何隐式转换,因为存在完全匹配。相反,它只是调用正确的函数。
我必须重载函数:
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 ambiguouswypisz((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);
现在,编译器不必进行任何隐式转换,因为存在完全匹配。相反,它只是调用正确的函数。