Pregunta

En caso de no emitir el compilador automáticamente a un doble en el siguiente? Al menos según Walter Savitch.

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) << endl;
    return 0;
}//error C2668: 'sqrt' : ambiguous call to overloaded function
//Visual Studio 2008 on Win Vista
¿Fue útil?

Solución

El problema es que hay tres versiones de sqrt para elegir:

     double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );

Desde que está pasando en un int, el compilador va a promover su argumento pero es igualmente válido para promover su número entero de cualquiera de los tipos anteriores, por lo que es ambiguo.

Puedes solucionar este problema simplemente echando explícitamente a uno de los tipos anteriores, como en:

cout << "The square root of k is: " << sqrt((double)k) << endl;

Otros consejos

error de llamada ambigua es que no sabe qué función a llamar a que no es implícitamente la conversión.

vistazo a la siguiente. Si creo mi propia función que toma un doble y devuelve un doble tiene ningún problema implícitamente la conversión. Debido a que su número entero se puede convertir a cualquiera de los tres sobrecargas que no sabe cómo llamarlo.

double mysqrt(double d)
{
   return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//Works Fine

Sin embargo, si añado otra versión de mysqrt que tiene un flotador creo un error de llamada ambigua.

double mysqrt(float f)
{
    return f;
}
double mysqrt(double d)
{
    return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//error C2668: 'mysqrt' : ambiguous call to overloaded function

Puesto que hay múltiples sqrt funciones (sobrecargas) y más de 1 puede aceptar un int como un parámetro sin perder precisión que depende de usted para especificar qué (y esto es una buena cosa porque no desea que el compilador de tomar decisiones por usted, basado en la evidencia 'circunstancial' - pasar un int a sqrt ).

C siempre devuelve el doble versión menos sqrtf se llama.

Prueba a transmitir su llamada con (doble)

Desde el MSDN: [

double sqrt(
   double x 
);
float sqrt(
   float x 
);  // C++ only
long double sqrt(
   long double x
);  // C++ only
float sqrtf(
   float x 
);

] 1

Hay varias sobrecargas a std :: sqrt en cmath. Se produce un flotador y otro toma un doble. El compilador no puede saber que desea ser llamado, y enteros se puede echar en cualquiera de ellos.

En ausencia de las sobrecargas adicionales, se proyectaría automáticamente a duplicar [este es el caso en C] como se esperaba.

Sí, debe emitir de forma automática de int a duplicar. g ++ compila esta bien, así que supongo VS está mal

Edit: No estoy seguro por qué respuesta mo se votó abajo. Pero creo que durante la sobrecarga de funciones en C ++, conversión automática siempre debe suceder a un tipo más elevado de datos en la conversión automática es posible. por ejemplo: si hay una opción para convertir de dentro a long, float y doble, se debe siempre hace un int a doble conversión

.

I intentado esto en g ++ y es llamando a la función sqrt (doble).

#include <iostream>
#include <cmath>
#include <typeinfo>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) <<' '<<  typeid(sqrt(k)).name()<< endl;
    return 0;
}

Así salida de typeid () es "d", que significa que se ha hecho una conversión automática de int a duplicar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top