c++ ambiguous-call

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) );