La llamada de error de sobrecargado es ambigua

La llamada de error de sobrecargado es ambigua
En este artículo, discutiremos un error que ocurre en el lenguaje C ++ que es una sobrecarga es ambiguo. Este error no afecta cómo se ejecuta el código porque ocurre en el momento de la compilación. Necesitamos saber qué sobrecarga es. En la sobrecarga, declaramos funciones con los mismos nombres pero diferentes tipos de datos. El sistema diferencia entre las funciones debido a sus tipos de datos. Ambiguo se refiere a tener múltiples significados o similitudes. De otras maneras, podemos decir que ambiguo significa poco claro. Entonces, el error se explica a sí mismo.

El error ocurre cuando una función sobrecarga el compilador interpreta las funciones como una sola función y no puede marcar la diferencia entre las dos funciones sobrecargadas en función de sus tipos de datos. Entonces, podemos decir que este error ocurre debido a la incapacidad del compilador para hacer una selección entre dos métodos sobrecargados correctamente. Se dice que todo este proceso es ambiguo porque no está claro. Los códigos y programas que contienen tales ambigüedades no pueden compilar y eventualmente generar errores.

Sintaxis

Esta no es una función o biblioteca incorporada que estamos discutiendo, sino que es un error, y un error no tiene una sintaxis específica. Este es el mensaje que el compilador devuelve cuando recibimos nuestro error.

Error: la llamada de 'setVal (int)' sobrecargada es ambigua

Nota: La palabra 'setVal (int)' no es constante.

Ejemplo # 01:

Para tener una mejor comprensión de nuestro error, ahora realizaremos un ejemplo para obtener el error y después de eso, resolveremos el error. Para hacerlo, hemos declarado una clase con el nombre Class1. En la clase1, hemos declarado datos privados de char sin firmar [bytes]. En la sección pública de nuestra clase, hemos declarado dos funciones con el mismo nombre, "Samefunc". Pero hemos pasado "Unsigned int" a uno como parámetro y "const char" al otro como parámetro para que podamos sobrecargar los métodos teniendo los mismos nombres y diferentes tipos de datos como parámetros. En el primer "SameFunc", hemos impreso "int" con el valor que se le pasó. En la segunda función, hemos impreso "char" con el valor pasado a nuestra segunda función. Con el uso de un objeto dentro de nuestra clase, llamamos al método el método principal. Ahora, ejecutaremos nuestro código para ver qué pasa.

#incluir
#Define bytes 8
usando el espacio de nombres STD;
clase Clase1

privado:
Datos de char sin firmar [bytes];
público:
nulo SameFunc (int);
nulo SameFunc (const char *);
;
void class1 :: mismofunc (int t)

cout<<"int"<
Void class1 :: SameFunc (const char *s)

cout<<"char"<
int main ()
clase1 p;
pag.mismofunc (0);
regresar 0;

Después de la ejecución de nuestro código, el sistema nos ha dado un mensaje de error. Si echamos un vistazo al mensaje de error, podemos ver que el mensaje es casi el mismo que discutimos anteriormente. La única diferencia es el nombre de la función. Le dijimos anteriormente que el nombre de la función seguirá cambiando dependiendo de lo que haya declarado como el nombre de su función. De todos modos, el sistema nos ha dado el error de que "la llamada de sobrecarga es ambigua". Surge una pregunta de que hemos pasado "0" a nuestra función y "0" es un entero, entonces, ¿por qué el sistema nos ha dado este error?? Elegamos el motivo e intentemos resolver el error.

Ahora, para resolver el error, no volveremos a escribir todo nuestro código completo, simplemente hemos eliminado la palabra clave "sin firmar" antes de "int" en nuestra primera función. Después de eso, ejecutamos nuestro código y el código se ha ejecutado con éxito.

El error fue causado porque el valor "0" tiene dos significados en el lenguaje C ++. En primer lugar, es un entero. En segundo lugar, en el caso de los caracteres, es una constante de puntero nulo. El compilador no pudo decidir en nuestro caso si nuestro parámetro de entrada era un entero o un puntero nulo constante. Estábamos utilizando dos tipos de datos para nuestros métodos int y char. Entonces, el compilador se confundió. Después de eliminar la palabra clave, el compilador tomó el parámetro como entero y ejecutó la función con un tipo de datos entero.

Ejemplo # 02:

Para que comprenda mejor el error que se está discutiendo. Hemos realizado otro ejemplo aquí. En este ejemplo, hemos declarado dos métodos con los mismos nombres "AddVals". Pero la diferencia entre las dos funciones es que uno está tomando enteros como parámetros de entrada y el otro está tomando flotadores como parámetros de entrada. Ambos métodos tienen el mismo propósito, están tomando parámetros de entrada y suman sus valores. En el método principal, imprimimos el resultado después de haber realizado operaciones en nuestros parámetros de entrada. Ejecutaremos nuestro código para verificar la salida.

#incluir
usando el espacio de nombres STD;
int addvals (int x, int y)

return x+y;

int addvals (float x, float y)
return x+y;

int main ()
cout<regresar 0;

Una vez más, el sistema no nos ha dado ninguna salida. En cambio, ha lanzado un mensaje de error. El mensaje de error es nuevamente el mismo que el anterior. Pero el nombre de la función es diferente. En este caso, pasamos los valores "1.2 "y" 3.4 ”a nuestra función, lo cual está claro que estos valores son flotadores. Puede surgir una pregunta sobre por qué el sistema no ha realizado su trabajo y nos ha dado el error. Para obtener el motivo, intentaremos resolver el error y al hacerlo también obtendremos nuestra respuesta.

Ahora, para resolver el error, hemos puesto "1.2f "y" 3.4f ”con nuestros parámetros. Ejecutaremos nuevamente el código para ver si este enfoque ayuda en la resolución de nuestro error o no. Vamos a ejecutar nuevamente nuestro código para ver qué pasa.

El sistema no nos ha dado ningún error esta vez y ha ejecutado con éxito nuestro código. Entonces, el problema en nuestro código era que no estábamos poniendo "F" en nuestros parámetros. Asumimos que el compilador los leería como valores flotantes en lugar de enteros. Pero nos equivocamos porque el compilador identifica todos los flotadores como dobles inicialmente a menos que pusiéramos "F" como un sufijo. Una vez que ponemos nuestro sufijo, el código se ha compilado con éxito.

Conclusión

En esta guía, discutimos otro error que es "la llamada de sobrecarga (función) es ambigua". Discutimos por qué ocurre el error. También discutimos el concepto de sobrecarga de funciones para comprender nuestro error de una mejor manera. Se realizaron ejemplos para ayudarlo a obtener un mejor control para resolver el error.