sobrecargar - ¿Por qué la sobrecarga de funciones genera un error ambiguo en C++?
sobrecargar== (1)
En los siguientes fragmentos de código, en la llamada a la función f(1)
, 1
es un literal de tipo int
y en la primera función el tipo de argumento void f(double d)
es double
y la segunda función void f(short int i)
tipo de argumento es short int .
Aquí 1
es un tipo int
no un tipo double
, entonces ¿Por qué el compilador genera un error ambiguo?
#include <iostream>
using namespace std;
void f(double d) // First function
{
cout<<d<<endl;
}
void f(short int i) // Second function
{
cout<<i<<endl;
}
int main()
{
f(1); // 1 is a literal of type int
return 0;
}
Porque, como señala su comentario, 1
es un literal de tipo int
.
Para el compilador, una conversión implícita de int
a short int
es igual de válida que una conversión implícita de int
to double
( véase el estándar de lenguaje C ++, §13.3).
Por lo tanto, dado que el compilador no puede decidir entre las sobrecargas short int
double
y short int
, se da por vencido y emite un diagnóstico.
Tenga en cuenta que la magnitud del parámetro de función no importa: solo el tipo.
(Sería molesto si el compilador eligiera, en tiempo de ejecución, la sobrecarga short int
si el argumento de la llamada era apropiado, y el double
en otras instancias).