vectores tipos sintaxis resueltos programacion funciones ejercicios ejemplos datos comandos codigos basicos c++ compiler-errors type-conversion

tipos - ¿Cuál es el tipo de C++ resultante de la adición?



tipos de datos en c++ (3)

Obtengo el error de compilación "llamada ambigua" para esto:

short i; MyFunc(i+1, i+1);

Donde hay dos definiciones para MyFunc: una que toma dos cortos y la otra toma dos carrozas.

Cuando yo escribo:

MyFunc(i, i+1);

No hay ningún error: el compilador deduce corto.

Mi pregunta es, ¿por qué ''corto'' + 1 puede resultar como un punto flotante, y cómo puedo evitar revisar todo mi código y agregar expresiones explícitas como:

MyFunc((short)(i+1), (short)(i+1));

Gracias.


Como se explica aquí al usar operaciones short en operaciones aritméticas, primero debe convertirse en un int . Así que en realidad el compilador está tratando de encontrar el MyFunc(int,int) correcto MyFunc(int,int) y tiene que elegir entre MyFunc(short,short) y MyFunc(float,float) , de ahí la ambigüedad.


i+1 se promociona a int ya que short es un tipo integral más pequeño que int .

así que MyFunc(i+1, i+1); es " MyFunc(int, int); "

Puede resolver la ambigüedad agregando sobrecarga, lo que hace que el despacho espere, algo así como:

void MyFunc(short, short); void MyFunc(float, float); template <typename T1, typename T2> std::enable_if<std::is_floating_point<T1>::value || std::is_floating_point<T2>::value> MyFunc(T1 t1, T2 t2) { MyFunc(static_cast<float>(t1), static_cast<float>(t2)); } template <typename T1, typename T2> std::enable_if<!std::is_floating_point<T1>::value && !std::is_floating_point<T2>::value> MyFunc(T1 t1, T2 t2) { MyFunc(static_cast<short>(t1), static_cast<short>(t2)); }


Durante la adición, si los operandos son más pequeños que int , se promueven a int y el resultado de i + 1 es también un int . Para más información, consulte este enlace . En este punto, durante la resolución de sobrecarga, se produce una conversión integral al tipo de flotación.