我正在为类编写C ++程序,我的编译器抱怨“模糊”函数调用。我怀疑这是因为有几个函数使用不同的参数定义。
如何告诉编译器我想要哪一个?除了特定于案例的修复,是否有一般规则,例如类型转换,可以解决这些问题?
修改
在我的情况下,我尝试在abs()
语句中调用cout
,传入两个double
。
cout << "Amount is:" << abs(amountOrdered-amountPaid);
EDIT2:
我包括这三个标题:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
EDIT3:
我已经完成了没有此代码的程序,但为了完成这个问题,我已经重现了这个问题。逐字错误是:
对'abs'的调用含糊不清。
编译器提供了三个版本的abs
,每个版本都使用不同的数据类型作为参数。
答案 0 :(得分:21)
发生的事情是,您已将<cstdlib>
(间接地,因为它包含在iostream
中)与using namespace std;
一起包含在内。此标头在std
中声明了两个名为abs()
的函数。一个接受并返回long long
,另一个返回long
。另外,全局命名空间中的一个(返回int
)来自<stdlib.h>
。
要修复:好吧,需要加倍的abs()
在<cmath>
,这实际上会给你你想要的答案!
答案 1 :(得分:5)
abs
和<cstdlib>
以及int
重载了long
所包含的long long
功能。由于您提供了double
作为参数,因此编译器没有精确匹配,因此它尝试将double
转换为abs
接受的类型,但它不知道是否它应该尝试将其转换为int
,long
或long long
,因此它不明确。
但您可能真的希望abs
获得double
并返回double
。为此,您需要包含<cmath>
。由于double
参数完全匹配,编译器不会抱怨。
当您包含不应发生的其他标头时,似乎会自动包含<cstdlib>
。编译器应该给出error: ‘abs’ was not declared in this scope
或类似的东西。
答案 2 :(得分:2)
尝试使用fabs
中定义的<cmath>
。它需要float
,double
和long double
作为参数。 abs
和<cmath>
都定义了<cstdlib>
。差异为abs(int)
,abs(long)
和abs(long long)
在<cstdlib>
中定义,而其他版本在<cmath>
中定义。
答案 3 :(得分:-2)
不确定为什么这不是调用abs的int版本,但你可以尝试将表达式(amountOrdered - amountPaid)类型转换为int,即
。cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );