我是靠谱客的博主 有魅力热狗,最近开发中收集的这篇文章主要介绍C++: 解释error: call of overloaded ‘abs(int)’ is ambiguousC++: 解释error: call of overloaded ‘abs(int)’ is ambiguous,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)

但是,如果我将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);
double fabs (double x);
float fabs (float x);
long double fabs (long double x);

在C++11中:

double abs (double x);
float abs (float x);
long double abs (long double x);
double abs (T x);
// additional overloads for integral types
double fabs (double x);
float fabs (float x);
long double fabs (long double x);
double fabs (T x);
// additional overloads for integral types

说明在C++98中,abs与fabs都是不支持对整型操作的,因此在调用函数方面,会出现歧义。
而在C++11中,abs与fabs都是支持对整型操作(默认将整型隐式转换成double类型)。

但是,为什么作业网上对fabs的编译能通过,对abs的编译不能通过呢?abs不能通过,说明编译器不支持c++11的标准,但fabs能通过又说明了编译器支持c++11的标准。这两者相互矛盾,只能说明是作业网上的编译器出现了问题。

所以,在以后的编程中,我们还是用<cstdlib>下的abs()函数对整型进行操作,用<cmath>下的fabs()函数对整型进行操作。这样既保险又不容易混淆!


以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!


最后

以上就是有魅力热狗为你收集整理的C++: 解释error: call of overloaded ‘abs(int)’ is ambiguousC++: 解释error: call of overloaded ‘abs(int)’ is ambiguous的全部内容,希望文章能够帮你解决C++: 解释error: call of overloaded ‘abs(int)’ is ambiguousC++: 解释error: call of overloaded ‘abs(int)’ is ambiguous所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部