c++ 如何修复“错误:对'abs'的调用不明确”

jckbn6z7  于 2023-04-01  发布在  其他
关注(0)|答案(6)|浏览(899)

我正在运行一个简单的C++程序从HackerRank关于指针和它的网站上工作正常.然而,当我运行它在MacOS,我得到error: call to 'abs' is ambiguous,我不知道到底是什么是模棱两可.
我已经看过类似问题的其他答案,但错误消息往往是Ambiguous overload call to abs(double),这不是我遇到的问题,因为我没有使用任何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行。

2jcobegt

2jcobegt1#

完整的错误消息如下:

$ 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.

<cmath>得到的abs的三个重载是abs(float)abs(double)abs(long double);它是不明确的,因为你有一个int参数,编译器不知道要转换为哪个浮点类型。
abs(int)是在<cstdlib>中定义的,因此#include <cstdlib>将解决您的问题。
如果你使用的是Xcode,你可以在Issues导航器(5)中点击你的issue旁边的三角形,获得关于错误的更多细节。

3ks5zfa0

3ks5zfa02#

对我来说,#include <cstdlib>并没有解决这个问题,也许是因为我不需要包含任何东西来使用abs。所以,如果它可以帮助其他人,通过显式转换,它对我来说很好,就像下面的代码一样:

*b = abs(int(num1 - num2));
rdrgkggo

rdrgkggo3#

在模板代码中,std::abs没有为unsigned类型定义,这一点很容易被忽略。举个例子,如果下面的方法为unsigned类型示例化,编译器可能会正确地抱怨std::abs是未定义的:

template<typename T>
bool areClose(const T& left, const T& right) {
    // This is bad because for unsigned T, std::abs is undefined
    // and for integral T, we compare with a float instead of
    // comparing for equality:
    return (std::abs(left - right) < 1e-7);
}

int main() {
    uint32_t vLeft = 17;
    uint32_t vRight = 18;
    std::cout << "Are the values close? " << areClose(vLeft, vRight) << std::endl;
}

在上面的代码中,areClose()的一个更好的定义,碰巧也解决了std::abs()未定义的问题,可能看起来像这样:

template<typename T>
bool areClose(const T& left, const T& right) {
    // This is better: compare all integral values for equality:
    if constexpr (std::is_integral<T>::value) {
        return (left == right);
    } else {
        return (std::abs(left - right) < 1e-7);
    }
}
mzillmmw

mzillmmw4#

如果你使用C编译器,你应该包括

#include <stdlib.h>

如果你使用C++编译器,那么你应该把abs改成std::abs。
希望有帮助:)

hsvhsicv

hsvhsicv5#

只要在#include上面加上#include,错误就会消失。

lsmd5eda

lsmd5eda6#

我使用#include <bits/stdc++.h>作为唯一的include语句,它对我很有效。我的代码:

#include <bits/stdc++.h>  
using namespace std;
class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        int n = nums.size();
        if(n == 0 || n == 1)
            return {};
        vector<int> ans;
        for(int i = 0; i < n; i++)
        {
            if(nums[abs(nums[i])-1] < 0)
                ans.push_back(abs(nums[i]));
            else
                nums[abs(nums[i])-1] = -1 * nums[abs(nums[i])-1];
        }
        return ans;
    }
};

相关问题