如何修复"模糊"函数调用?

Mos*_*she 18 c++ ambiguous-call

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

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

编辑:

在我的情况下,我尝试abs()在一个cout声明中调用,传入两个doubles.

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

EDIT2:

我包括这三个标题:

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

using namespace std;
Run Code Online (Sandbox Code Playgroud)

EDIT3:

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

打电话给'abs'是模棱两可的.

编译器提供三个版本abs,每个版本采用不同的数据类型作为参数.

mkb*_*mkb 21

发生的事情是你已经包括<cstdlib>(间接地,因为它被包括在内iostream)using namespace std;.此标头声明std了名称中的两个函数abs().一个接受并返回long long,另一个返回long.另外,全局命名空间(返回int)中的一个来自<stdlib.h>.

修复:好吧,abs()需要加倍<cmath>,这实际上会给你你想要的答案!

  • TL; DR:避免使用命名空间. (5认同)

Joh*_*nPS 5

abs由包括功能<cstdlib>被重载intlonglong long.既然你给一个double作为参数,编译器并没有一个确切的配合,所以它会尝试将转换double到一种abs接受,但它不知道它是否应该尝试转换它int,long或者long long,因此它是不明确的.

但你可能真的希望得到abs一个double并返回一个double.为此你需要包括<cmath>.由于double参数完全匹配,编译器不会抱怨.

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