El uso de flotación da error de “invocar a la función sobrecargada es ambigua”

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

El código es:

 #include  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) 

5.5 es un double , pero ninguna de sus funciones tiene un double argumento. Entonces, el comstackdor 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 vino, porque ahora hay una función que puede tomar un double argumento, 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 que un número llegue a un punto flotante.

Miremos el estándar de C ++

§ 2.13.4

1 Un literal flotante consiste en una parte entera, un punto decimal, una parte de fracción, una eo E, un exponente de entero con signo opcional 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] O la parte entera o la parte fracción (no ambas) se pueden omitir; ya sea el punto decimal o la letra e (o E) y el exponente (no ambos) se pueden omitir. La parte entera, el punto decimal opcional y la parte de fracción 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 float, los sufijos l y L especifican long double. Si el valor escalado no está en el rango de valores representables para su tipo, el progtwig está mal formado.

(Perdón por publicar todo, pero puede obtener más información acerca de los float esta manera)

Intereting Posts