C++: 解释error: call of overloaded ‘abs(int)’ is ambiguous
标签:C++ overload abs(int)
by 小威威
昨天在完成课后作业的时候我发现在<cmath>
头文件下,return abs(x1*x2)
在ubuntu上g++编译成功,但在作业网就编译不成功,错误信息如下:(x1,x2指的是变量)
Compilation fail.
Vector.cpp: In member function ‘int Vector::cross_product(Vector)’:
Vector.cpp:48: error: call of overloaded ‘abs(int)’ is ambiguous
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:94: note: candidates are: double std::abs(double)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:98: note: float std::abs(float)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:102: note: long double std::abs(long double)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
但是,如果我将abs改成fabs,或者是将头文件<cmath>
改为<cstdlib>
,作业网就能正常编译。
对此我感到非常奇怪,google后发现没有一篇详细分析这一情况的文章,所以决定自己亲自研究。
我先查阅了abs函数:发现在C语言中,除了abs()函数存在于<stdlib.h>
,其它数学函数都存在于<math.h>
。所以不难想到,在C++中使用abs()函数需要引用<cstdlib>
的头文件,而不是<cmath>
。因此解释了“将<cmath>
改为<cstdlib>
后就编译成功”这一解决方案。同样的,因为fabs()函数存在于<cmath>
,所以将abs()改为fabs()便可正常编译。
但是,虽然这两种方案都能解决编译失败这一问题,但是为什么错误信息上显示abs()有歧义?经过查询我发现<cmath>
中也定义了abs()函数,这个abs()函数不同于<stdlib>
函数,因为它可以对浮点数进行操作而<cstdlib>
中的abs()函数只能对整型操作。
cplusplus.com中显示:
在C++98中:
double abs (double x);float abs (float x);
long double abs (long double x);