【问题标题】:Need explanation for the compilation error in a simple C++ program demonstrating overloaded function [duplicate]需要解释演示重载函数的简单 C++ 程序中的编译错误 [重复]
【发布时间】:2016-12-07 21:41:49
【问题描述】:

我想知道为什么会出现编译错误

调用重载的 'my_add(double, double, double)' 不明确

当我尝试如下重载 my_add 函数时:

//=============== Start of Program ===========
#include <iostream.h>
int my_add( int x, int y , int z) 
   {
    return (x+y+z); 
   }
float my_add( float x, float y , float z) 
   {
    return (x+y+z); 
   }
int main (void)
{
 cout<<my_add(5,6,1);
 cout<<my_add(5.5,6.5,1.0);
} 

//=============== End of Program ===========

但是,当我将my_add( float x, float y , float z) 中的floats 更改为doubles 时,代码编译良好​​strong>。

我学到的是,对于重载一个函数,它的定义应该在参数数量、参数顺序或参数类型方面有所不同。

就我而言,两个版本的函数在参数类型上有所不同。

我使用的 IDE 是 Code Blocks。

【问题讨论】:

  • 5.0 是一个双字(5.0f 用于浮点数)。因此这些需要转换,并且由于 intfloat 都是有效的候选者,因此重载是模棱两可的。
  • 亲爱的迈克尔,我不明白“因为 int 和 float` 都是有效的候选人”。能详细解释一下吗?
  • 您将双精度类型的参数传递给重载函数,它可以选择采用整数或采用浮点数的参数。问题是存在从 double 到 int 以及从 double 到 float 的隐式转换,但是编译器不知道您想要哪个,因此重载是模棱两可的。 (P.S:我的用户名不是 Micheal)
  • @Borgleader 但 5.5 不是浮点数吗?当我们想将它作为浮点数传递时,是否有必要将 'f' 附加到 5.5 ?我一直认为 5.5 是浮点数或双精度数,两者之间的唯一区别是这两种类型可以取的值的范围。
  • 我之前说过,5.5 是一个双精度字面量,它的类型是double。通常这无关紧要,因为隐式转换会将双精度转换为浮点数,但在这里因为您还有 int 的重载,编译器不知道它应该进行哪种转换。

标签: c++


【解决方案1】:

5.5 实际上是一个 double 文字。所以它需要一个转换来匹配你的一个重载。但是它可以通过一次转换来匹配两者,这会导致歧义。

解决方案包括使用 float 文字 (5.5f) 或强制转换。为了解决歧义,将解决方案应用到单个参数就足够了。

【讨论】:

  • 亲爱的讲故事的人,您能解释一下“它可以通过一次转换匹配两者”吗?
  • @HitX11 C++ 在称为重载解析的过程中解析对重载函数的调用。它通过将参数的类型与函数形式参数的类型相匹配来做到这一点。如果不完全匹配,其中一部分涉及进行隐式转换(例如 intfloat 或反之亦然)。
  • 柜员,但 5.5 不是浮点数吗?当我们想将它作为浮点数传递时,是否有必要将 'f' 附加到 5.5 ?我一直认为 5.5 是浮点数或双精度数,两者之间的唯一区别是这两种类型可以采用的值范围
  • @HitX11 这不是float 文字,而是double。它们可能在一定程度上兼容,但仍然是不同的类型。你绕不过去,c++ 是一种强类型语言。
  • @HitX11 5.5double5.5ffloat,正如 herehereherehere 所解释的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2015-05-24
  • 2012-11-08
相关资源
最近更新 更多