1. ホーム
  2. c++

[解決済み] "エラー:'abs'の呼び出しがあいまいです "の修正方法

2022-02-16 09:39:42

質問

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行目で発生します。

解決方法を教えてください。

エラーメッセージの全文は以下の通りです。

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

の3つのオーバーロードは abs から持っている <cmath>abs(float) , abs(double)abs(long double) があるため、曖昧です。 int という引数があり、コンパイラはどの浮動小数点型に変換すればいいのかわからない。

abs(int) が定義されているのは <cstdlib> ということで #include <cstdlib> で解決します。

Xcodeを使用している場合は、Issuesナビゲータ(⌘5)で、課題の横にある三角形をクリックすると、エラーの詳細を確認できます。