web-dev-qa-db-fra.com

Comment puis-je corriger un appel de fonction "ambigu"?

Je travaille sur un programme C++ pour la classe, et mon compilateur se plaint d'un appel de fonction "ambigu". Je soupçonne que c'est parce qu'il existe plusieurs fonctions définies avec différents paramètres.

Comment puis-je dire au compilateur lequel je veux? Mis à part un correctif spécifique à la casse, existe-t-il une règle générale, telle que le transtypage, qui pourrait résoudre ce genre de problèmes?

Modifier:

Dans mon cas, j'ai essayé d'appeler abs() à l'intérieur d'une instruction cout, en passant deux doubles.

cout << "Amount is:" << abs(amountOrdered-amountPaid);

Edit2:

J'inclus ces trois en-têtes:

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

Edit3:

J'ai terminé le programme sans ce code, mais dans l'intérêt de poursuivre avec cette question, j'ai reproduit le problème. L'erreur textuelle est:

L'appel à "abs" est ambigu.

Le compilateur propose trois versions de abs, chacune prenant un type de données différent comme paramètre.

19
Moshe

Ce qui s'est passé, c'est que vous avez inclus <cstdlib> (Indirectement, car il est inclus par iostream) avec using namespace std;. Cet en-tête déclare deux fonctions dans std avec le nom abs(). L'un prend et renvoie long long, Et l'autre renvoie long. De plus, il y a celui dans l'espace de noms global (qui renvoie int) qui vient de <stdlib.h>.

Pour corriger: eh bien, la abs() qui prend le double est dans <cmath>, Et cela vous donnera en fait la réponse que vous voulez!

21
mkb

La fonction abs incluse par <cstdlib> est surchargé pour int et long et long long. Puisque vous donnez un double comme argument, le compilateur n'a pas un ajustement exact, il essaie donc de convertir le double en un type que abs accepte, mais il ne le fait pas ne sais pas s'il doit essayer de le convertir en int, long ou long long, donc c'est ambigu.

Mais vous voulez probablement vraiment le abs qui prend un double et retourne un double. Pour cela, vous devez inclure <cmath>. Puisque l'argument double correspond exactement, le compilateur ne se plaindra pas.

Il paraît que <cstdlib> est inclus automatiquement lorsque vous incluez les autres en-têtes, ce qui ne devrait pas se produire. Le compilateur aurait dû donner error: ‘abs’ was not declared in this scope ou quelque chose de similaire.

5
JohnPS

Essayez d'utiliser fabs défini dans <cmath>. Il prend float, double et long double Comme arguments. abs est défini à la fois dans <cmath> et <cstdlib>. La différence est abs(int), abs(long) et abs(long long) sont définis dans <cstdlib> Tandis que les autres versions sont définies dans <cmath>.

2
fr0stw01f