c++ overloading ambiguous

c++ - El uso de flotante genera el error "la llamada a la función sobrecargada es ambigua"



overloading ambiguous (1)

5.5 es un double , pero ninguna de sus funciones tiene un argumento double . Entonces, el compilador se confunde sobre si llamar a la función con el parámetro int , o la función con el parámetro float . Entonces, aparece un error que dice que es ambiguo.

Es por eso que cuando cambiaste la función para tener un parámetro double , el error ya no apareció, porque ahora hay una función que puede tomar un argumento double , y por lo tanto hay ambigüedad allí.

También puede solucionar el problema llamando a la función como

obj.add(5.5f);

Agregar la f después de un número lo convierte en flotante.

Veamos el estándar C ++

§ 2.13.4

1 Un literal flotante consta de una parte entera, un punto decimal, una parte fracción, una e o E, un exponente entero opcionalmente firmado y un sufijo de tipo opcional. Las partes enteras y fraccionarias consisten en una secuencia de dígitos decimales (base diez). Las comillas simples de separación opcionales en una secuencia de dígitos se ignoran al determinar su valor. [Ejemplo: los literales 1.602''176''565e-19 y 1.602176565e-19 tienen el mismo valor. —Ejemplo final] Se puede omitir la parte entera o la parte fracción (no ambas); se puede omitir el punto decimal o la letra e (o E) y el exponente (no ambos). La parte entera, el punto decimal opcional y la parte fraccional opcional forman la parte significativa del literal flotante. El exponente, si está presente, indica la potencia de 10 por la cual se debe escalar la parte significativa. Si el valor escalado está en el rango de valores representables para su tipo, el resultado es el valor escalado si es representable, de lo contrario, el valor representable más grande o más pequeño más cercano al valor escalado, elegido de una manera definida por la implementación. El tipo de un literal flotante es doble a menos que se especifique explícitamente por un sufijo. Los sufijos f y F especifican flotante, los sufijos l y L especifican doble largo. Si el valor escalado no está en el rango de valores representables para su tipo, el programa está mal formado.

(Perdón por publicarlo todo, pero puedes aprender más sobre float esta manera)

Esta pregunta ya tiene una respuesta aquí:

Estoy sobrecargando la función add() , pero cuando utilicé el tipo de datos float muestra un error. Sin embargo, cuando lo cambio a double , funciona bien. ¿Por qué el float está causando el error?

El código es:

#include <iostream> using namespace std; class students{ private: int i; float f; public: void add(int b){ i=b; cout << "First Int: " << i; } void add(float c){ f=c; cout << "Second Int: " << f; } }; int main(){ students obj; obj.add(9); obj.add(5.5); }

Errores:

In function ''int main()'': [Error] call of overloaded ''add(double)'' is ambiguous [Note] candidates are: [Note] void students::add(int) [Note] void students::add(float)