25

我正在开发一个用于类的 C++ 程序,而我的编译器抱怨“模棱两可”的函数调用。我怀疑这是因为有几个函数定义了不同的参数。

我如何告诉编译器我想要哪一个?除了针对特定情况的修复之外,是否有一般规则(例如类型转换)可以解决这类问题?

编辑:

就我而言,我尝试在语句abs()内部调用,传入两个s.coutdouble

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

编辑2:

我包括这三个标题:

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

using namespace std;

编辑3:

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

对“abs”的调用是模棱两可的。

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

4

4 回答 4

23

发生的事情是您已经包含<cstdlib>(间接,因为它包含在 中iostream)以及using namespace std;. std这个头文件用名字声明了两个函数abs()。一个取回long long,另一个返回long。另外,在全局命名空间(返回int)中有一个来自<stdlib.h>.

修复:嗯,abs()需要 double 的那个是 in <cmath>,这实际上会给你你想要的答案!

于 2011-09-26T02:08:13.510 回答
5

包含的abs函数<cstdlib>intandlong和重载long long。由于您将 adouble作为参数,编译器没有完全匹配,因此它尝试将 转换为接受double的类型abs,但它不知道是否应该尝试将其转换为intlonglong long,因此它是模棱两可的。

但是您可能真的想要absadouble并返回 a double。为此,您需要包括<cmath>. 由于double参数完全匹配,编译器不会抱怨。

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

于 2011-09-26T03:49:26.060 回答
2

尝试使用fabs定义在<cmath>. 它需要float,doublelong double作为参数。abs<cmath>和中定义<cstdlib>。不同之处在于abs(int)abs(long)abs(long long)定义,<cstdlib>而其他版本在 中定义<cmath>

于 2013-12-05T13:23:16.593 回答
-2

不知道为什么这不调用 abs 的 int 版本,但您可以尝试将表达式 (amountOrdered - amountPaid) 类型转换为 int 即

cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );
于 2011-09-26T01:52:15.903 回答