web-dev-qa-db-fra.com

Comment réparer "Erreur: appeler" ABS 'est ambigu "

Je suis un programme simple C++ de Hackerrank sur les pointeurs et cela fonctionne bien sur le site Web. Cependant, quand je l'exécute sur Macos, je reçois error: call to 'abs' is ambiguous Et je ne suis pas sûr exactement ce qui est ambigu.

J'ai examiné d'autres réponses à des questions similaires, mais le message d'erreur a tendance à être Ambiguous overload call to abs(double), ce qui n'est pas le problème que je vais avoir, car je n'ai utilisé aucun doublement. J'ai également essayé, y compris les fichiers d'en-tête cmath et math.h, Mais le problème persiste.

#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;
}

Mon problème se produit avec la ligne 8.

3
AkThao

Le message d'erreur complet est:

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

Les trois surcharges de abs que vous avez à partir de <cmath> Sont abs(float), abs(double) et abs(long double); Il est ambigu parce que vous avez un argument int et le compilateur ne sait pas quel type de point flottant à convertir.

abs(int) est défini dans <cstdlib>, donc #include <cstdlib> résoudra votre problème.

Si vous utilisez Xcode, vous pouvez obtenir plus de détails sur l'erreur dans les numéros Navigator (⌘5) et en cliquant sur le triangle à côté de votre problème.

9
zneak

Pour moi, #include <cstdlib> N'a pas résolu la question, peut-être parce que je n'ai pas eu à inclure quoi que ce soit à utiliser abs. Donc, au cas où cela aide quelqu'un d'autre, avec la coulée explicite, cela a bien fonctionné pour moi comme dans le code suivant:

*b = abs(int(num1 - num2));
3
ana

si votre utilisation de C compilateur C devriez inclure

#include <stdlib.h>

et utilisez ABS sans std ::. Si vous utilisez C++ Compiler, vous devriez changer ABS à STD :: ABS.

J'espère que ça aide:)

2
NewMe