函数重载和双精度和长精度之间的混淆

时间:2018-06-20 15:49:24

标签: c++

我希望可以编译以下简单代码:

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

我在这里真的迷路了。

1 个答案:

答案 0 :(得分:5)

12int类型的文字,而2.0double

因此,重载都不是您的类型的完全匹配项,为解决重载,它们的排名也类似,因此要求编译器发出诊断信息。 (请注意,即使intlong具有相同的大小和补码方案,它们也必须是不同的类型。)

您可以使用Foo(1L, 2L);进行修复。