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