【问题标题】:The output of function overloading is not as expected函数重载的输出不如预期
【发布时间】:2018-11-25 08:16:22
【问题描述】:

我正在学习 C++ 中的函数重载,我对函数匹配有疑问。在我得到的代码下面运行 error C2668: 'function' : ambiguous call to overloaded function.

link 清楚地回答了我出错的原因。 数字 1.2 和 2.2 是类型double。尽管我还有一个疑问,但在那里没有得到回答。 当我尝试调用 function(1.2,2)function(1,2.2) 时,它会打印为 "int function"。为什么它没有给出与上述相同的错误。

代码:

  void function(int y,int w)
    {
      printf("int function");

    }


 void function(float y,float w)
  {
    printf("float function");
  }


int main()
 {
   function(1.2,2.2);
   return 0;
 }

【问题讨论】:

  • @πάνταῥεῖ:他已经提供了一个 MCVE,它就在链接上。建议重新开放。
  • @YePhIcK:你关注他的链接了吗?它具有所有必要的上下文恕我直言。
  • @einpoklum 来吧,这与minimal reproducible example 相差甚远
  • @einpoklum 一个问题必须独立。这意味着代码必须在问题中,而不是链接。我建议阅读How to Ask 并查看关闭的原因。
  • 当您使用 int 字面量时,编译器可以找到只需要一次转换而不是两次转换的候选函数。更好的匹配,只有其中一个。因此,对于哪个更好,不再有歧义,并且很乐意将 double 强制转换为 int。

标签: c++ function overloading


【解决方案1】:

当我尝试调用function(1.2,2)function(1,2.2) 时,它打印为“int 函数”。为什么它没有给出与上述相同的错误。

因为根据overload resolution的规则void function(int y,int w)void function(float y,float w)匹配更好,因此没有歧义。

调用function(1.2,2)function(1,2.2) 都有一个参数是int,并且与void function(int y,int w) 的参数之一完全匹配,因此只需要一种类型转换,double 到@ 987654331@。另一方面,void function(float y,float w) 需要两次转换 intfloatdoublefloat,这就是使用 int 重载的原因。

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 2016-02-13
    • 2021-10-04
    • 2014-09-22
    • 1970-01-01
    • 2021-03-06
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多