Ne pas le compilateur Visual Studio 2008 autocast à double avec sqrt en C ++?

StackOverflow https://stackoverflow.com/questions/2452510

  •  20-09-2019
  •  | 
  •  

Question

Si pas le compilateur automatiquement jeté un double dans ce qui suit? Au moins selon 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
Était-ce utile?

La solution

Le problème est qu'il ya trois versions de sqrt à choisir:

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

Puisque vous passez dans un int, le compilateur va promouvoir votre argument, mais il est tout aussi valable pour promouvoir votre entier à l'un des types ci-dessus, il est donc ambigu.

Vous pouvez corriger cela simplement jeter explicitement à l'un des types ci-dessus, comme dans:

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

Autres conseils

erreur Ambiguous appel est qu'il ne sait pas quelle fonction à appeler non pas que sa conversion implicite.

regard sur ce qui suit. Si je crée ma propre fonction qui prend un double et retourne un double, il n'a pas de problème de conversion implicite. il ne sait pas quoi appeler depuis votre entier peut être converti en l'un des trois surcharges.

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

Cependant, si j'ajoute une autre version de mysqrt qui prend un flotteur je crée une erreur d'appel ambigu.

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

Il y a plusieurs std :: Les surcharges sqrt en cmath. On prend un flotteur et un autre prend un double. Le compilateur ne peut pas savoir que vous voulez appeler, et ints peut être jeté dans l'un d'eux.

En l'absence des autres surcharges, il jetterait automatiquement doubler [c'est le cas en C] comme prévu.

Oui, il devrait lancer automatiquement int doubler. g ++ compile ce bien donc je suppose que VS est erroné

EDIT: ne sais pas pourquoi réponse est mo-bas ont voté. Mais je pense que pendant la surcharge de fonction en c ++, la conversion automatique doit toujours arriver à un type de données le plus élevé dans la conversion automatique est possible. Ex: s'il y a une option pour convertir en et à long, float et double, il devrait toujours fait un int double conversion

.

J'ai essayé en g ++ et il appelle la fonction sqrt (double).

#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;
}

So sortie de typeid () est "d" ce qui signifie qu'il a fait une conversion automatique de doubler int.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top