c++ - ¿Cómo soluciono una llamada a la función "ambigua"?
ambiguous-call (4)
Estoy trabajando en un programa de C ++ para la clase, y mi compilador se queja de una llamada de función "ambigua". Sospecho que esto se debe a que hay varias funciones definidas con diferentes parámetros.
¿Cómo puedo decirle al compilador cuál quiero? Aparte de una solución específica para cada caso, ¿hay alguna regla general, como el encasillado, que pueda resolver este tipo de problemas?
Editar:
En mi caso, traté de llamar a abs()
dentro de una declaración cout
, pasando dos s double
.
cout << "Amount is:" << abs(amountOrdered-amountPaid);
Edit2:
Estoy incluyendo estos tres encabezados:
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
Edit3:
He terminado el programa sin este código, pero con el interés de seguir adelante con esta pregunta, he reproducido el problema. El error textual es:
Llamar a ''abs'' es ambiguo.
El compilador ofrece tres versiones de abs
, cada una con un tipo de datos diferente como parámetro.
Intente usar fabs
definidos en <cmath>
. Toma float
, double
y long double
como argumentos. abs
se define tanto en <cmath>
como en <cmath>
<cstdlib>
. La diferencia es que abs(int)
, abs(long)
y abs(long long)
se definen en <cstdlib>
mientras que otras versiones se definen en <cmath>
.
La función abs
incluida por <cstdlib>
está sobrecargada para int
y long
y long long
. Dado que asigna un double
como argumento, el compilador no tiene un ajuste exacto, por lo que intenta convertir el double
en un tipo que abs
acepta, pero no sabe si debería intentar convertirlo en int
, long
o long long
, de ahí que sea ambiguo.
Pero probablemente realmente quieras los abs
que toman un double
y devuelven un double
. Para esto necesitas incluir <cmath>
. Como el double
argumento coincide exactamente, el compilador no se quejará.
Parece que <cstdlib>
se incluye automáticamente cuando se incluyen los otros encabezados que no deberían suceder. El compilador debería haber dado un error: ''abs'' was not declared in this scope
o algo similar.
Lo que pasa es que has incluido <cstdlib>
(indirectamente, ya que iostream
lo incluye) junto con el using namespace std;
. Este encabezado declara dos funciones en std
con el nombre abs()
. Uno toma y regresa long long
, y el otro regresa long
. Además, hay uno en el espacio de nombres global (que devuelve int
) que viene de <stdlib.h>
.
Para corregirlo: bueno, el abs()
que toma el doble está en <cmath>
, ¡y en realidad le dará la respuesta que desea!
No estoy seguro de por qué esto no llama a la versión int de abs, pero puedes probar a escribir la expresión (amountOrdered - amountPaid) como int ie
cout <<"Amount is: "<< abs( (int)(amountOrdered - amountPaint) );