我希望可以编译以下简单代码:
void Foo(long a, long);
void Foo(long a, double b);
int main()
{
Foo(1, 2);
Foo(1, 2.0);
}
编译器输出:
prog.cpp: In function ‘int main()’:
prog.cpp:8:11: error: call of overloaded ‘Foo(int, int)’ is ambiguous
Foo(1, 2);
^
prog.cpp:3:6: note: candidate: void Foo(long int, long int)
void Foo(long a, long);
^~~
prog.cpp:4:6: note: candidate: void Foo(long int, double)
void Foo(long a, double b);
^~~
我不明白为什么通话不明确。对我来说,Foo(unsigned long a, unsigned long)
显然比void Foo(unsigned long a, double b)
的{{1}}更接近。
但是如果我将Foo(1, 2)
替换为long
,它将编译:
int
我在这里真的迷路了。
答案 0 :(得分:5)
1
和2
是int
类型的文字,而2.0
是double
。
因此,重载都不是您的类型的完全匹配项,为解决重载,它们的排名也类似,因此要求编译器发出诊断信息。 (请注意,即使int
和long
具有相同的大小和补码方案,它们也必须是不同的类型。)
您可以使用Foo(1L, 2L);
进行修复。