首页 > 解决方案 > 如何解决“错误:对‘abs’的调用不明确”

问题描述

我正在从 HackerRank 运行一个关于指针的简单 C++ 程序,它在网站上运行良好。但是,当我在 MacOS 上运行它时,我得到error: call to 'abs' is ambiguous并且我不确定到底什么是模棱两可的。

我查看了类似问题的其他答案,但错误消息往往是Ambiguous overload call to abs(double),这不是我遇到的问题,因为我没有使用任何双打。我也尝试过包含头文件cmathmath.h,但问题仍然存在。

#include <stdio.h>
#include <cmath>

void update(int *a,int *b) {
    int num1 = *a;
    int num2 = *b;
    *a = num1 + num2;
    *b = abs(num1 - num2);
}

int main() {
    int a, b;
    int *pa = &a, *pb = &b;

    scanf("%d %d", &a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);

    return 0;
}

我的问题发生在第 8 行。

标签: c++cmath

解决方案


完整的错误信息是:

$ clang++ test.cpp
test.cpp:8:10: error: call to 'abs' is ambiguous
    *b = abs(num1 - num2);
         ^~~
.../include/c++/v1/math.h:769:1: note: candidate function
abs(float __lcpp_x) _NOEXCEPT {return ::fabsf(__lcpp_x);}
^
.../include/c++/v1/math.h:769:1: note: candidate function
abs(double __lcpp_x) _NOEXCEPT {return ::fabs(__lcpp_x);}
^
.../include/c++/v1/math.h:769:1: note: candidate function
abs(long double __lcpp_x) _NOEXCEPT {return ::fabsl(__lcpp_x);}
^
1 error generated.

abs您拥有的三个重载<cmath>abs(float),abs(double)abs(long double); 这是模棱两可的,因为您有一个int参数并且编译器不知道要转换为哪种浮点类型。

abs(int)中定义<cstdlib>,因此#include <cstdlib>将解决您的问题。

如果您使用的是 Xcode,您可以在问题导航器 (⌘5) 中获取有关错误的更多详细信息,然后单击问题旁边的三角形。


推荐阅读