-->

暧昧超载调用ABS(双)(Ambiguous overload call to abs(double

2019-07-04 15:49发布

我有以下的C ++代码:

#include <math.h>
#include <cmath.h>      // per http://www.cplusplus.com/reference/clibrary/cmath/abs/

// snip ...

if ( (loan_balance < 0) && (abs(loan_balance) > loan_payment) ) {
    ...
}

make炸毁的:

error: call of overloaded 'abs(double)' is ambiguous

也感兴趣:

/usr/include/stdlib.h:785: note: candidates are: int abs(int)

如何指定编译器需要调用cmath.h可以处理花车ABS()?

编译器信息(不知道这是否事项):

[some_man@some_box ~/some_code]#  gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr    /share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)

Answer 1:

<math.h>是C标准库头。 它定义在全局命名空间的东西很多。 头<cmath>是C ++版本标头的。 它本质上定义的命名空间中的同样的东西std 。 (有一些差异,比如,在C ++版本带有某些功能的过载,但是这并不重要。)的报头<cmath.h>不存在。

由于供应商不希望保持的本质上是相同的头两个版本,他们想出了不同的可能性,有幕后只是其中之一。 通常情况下,这是C头(因为C ++编译器能够解析,而相反将无法正常工作),以及C ++头只包括和拉一切都变成命名空间std 。 或有使用或不解析相同的标题一些宏观魔法namespace std缠与否。 对此补充说,在某些环境中,如果头没有一个文件扩展名(如编辑未能彰显代码等),它的尴尬。 因此,一些供应商将有<cmath>是单衬里包括与一些其它头.h扩展。 或一些将映射所有包括匹配<cblah><blah.h>其中,通过宏观魔法,成为C ++头时__cplusplus被定义,否则成为C报头)或<cblah.h>或任何。

这就是为什么在某些平台上包括像的原因<cmath.h>这应该不存在,将初步成功,尽管它可能使编译壮观失败以后。

我不知道它的std您使用LIB实现。 我想这是自带的GCC的一个,但是这个我不知道,所以我不能解释你的情况正是如此。 但可以肯定的是上述供应商特定的黑客之一的组合和你包含一个头,你不应该把自己列入。 也许这是一个地方<cmath>映射到<cmath.h>与特定的,你却没有定义,这样就结束了两个定义(套)宏(S)。

但是请注意,此代码仍然不应该编译:

#include <cmath>

double f(double d)
{
  return abs(d);
}

不应该有一个abs()在全局命名空间(它的std::abs() 然而,按照上述实施技巧,有很可能是。 后来移植这样的代码(或只是想与你的供应商的下一个版本,它不容许这种编译)可能会非常繁琐,所以你应该留意这一点。



Answer 2:

它归结为: math.hC并创造了超过10年前。 在math.h中,由于其原始的性质, abs()函数是“基本上”只为整数类型,如果你想获得双重的绝对值,你不得不使用fabs() 当C ++创建花了math.h ,并使其cmathcmath基本上MATH.H但C ++提高。 它改进之类的东西具有区分fabs()和ABS,和只是由abs()两个双打和整数类型。 综上所述之一:使用math.h中,并使用abs()为整数, fabs()双打或使用CMATH,只是有ABS的一切(更容易和建议)

希望这有助于谁是有同样的问题,任何人!



Answer 3:

使用晶圆厂()代替ABS(),这是相同的,但对于花车,而不是整数。



文章来源: Ambiguous overload call to abs(double)
标签: c++ std cmath