如何修复“模糊”函数调用?

时间:2011-09-26 01:35:00

标签: c++ ambiguous-call

我正在为类编写C ++程序,我的编译器抱怨“模糊”函数调用。我怀疑这是因为有几个函数使用不同的参数定义。

如何告诉编译器我想要哪一个?除了特定于案例的修复,是否有一般规则,例如类型转换,可以解决这些问题?

修改

在我的情况下,我尝试在abs()语句中调用cout,传入两个double

cout << "Amount is:" << abs(amountOrdered-amountPaid);

EDIT2:

我包括这三个标题:

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

EDIT3:

我已经完成了没有此代码的程序,但为了完成这个问题,我已经重现了这个问题。逐字错误是:

  

对'abs'的调用含糊不清。

编译器提供了三个版本的abs,每个版本都使用不同的数据类型作为参数。

4 个答案:

答案 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接受的类型,但它不知道是否它应该尝试将其转换为intlonglong long,因此它不明确。

但您可能真的希望abs获得double并返回double。为此,您需要包含<cmath>。由于double参数完全匹配,编译器不会抱怨。

当您包含不应发生的其他标头时,似乎会自动包含<cstdlib>。编译器应该给出error: ‘abs’ was not declared in this scope或类似的东西。

答案 2 :(得分:2)

尝试使用fabs中定义的<cmath>。它需要floatdoublelong 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) );