Non ritiene il compilatore Visual Studio 2008 autocast di raddoppiare con sqrt in C ++?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Non dovrebbe lanciare il compilatore automaticamente ad un doppio in seguito? Almeno secondo 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
È stato utile?

Soluzione

Il problema è che ci sono tre versioni di sqrt tra cui scegliere:

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

Dal momento che si sta passando in una int, il compilatore sta per promuovere il tuo argomento, ma è altrettanto valido per promuovere il tuo intero a uno qualsiasi dei tipi di cui sopra, quindi è ambiguo.

È possibile risolvere questo problema semplicemente esplicitamente colata a uno dei tipi di cui sopra, come in:

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

Altri suggerimenti

errore chiamata ambiguo è che non sa quale funzione chiamare non è che la sua non è implicitamente conversione.

guarda quanto segue. Se creo la mia funzione che prende un doppio e restituisce un double non ha alcun problema implicito conversione. Dal momento che il numero intero può essere convertito in uno qualsiasi dei tre sovraccarichi non sa come chiamarla.

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

Tuttavia, se aggiungo un'altra versione di mysqrt che prende un galleggiante creo un errore chiamata 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

Dato che ci sono molteplici sqrt funzioni (sovraccarichi) e più di 1 può accettare un int come parametro senza perdere la precisione è a voi per specificare quali (e questa è una buona cosa perché non si desidera che il compilatore di prendere decisioni per voi sulla base di prove 'circostanziali' - passare un int a sqrt ).

C restituisce sempre la doppia versione a meno sqrtf si chiama.

Prova a trasmettere la chiamata con (doppia)

Dal MSDN: [

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

] 1

Ci sono diversi overload di std :: sqrt in cmath. Si prende un galleggiante e un altro prende una doppia. Il compilatore non può sapere che vuoi essere chiamato, e interi può essere gettato in nessuna di esse.

In assenza di sovraccarichi aggiuntivi, sarebbe automaticamente gettato raddoppiare [questo è il caso in C] come previsto.

Sì, dovrebbe automaticamente gettato da int a raddoppiare. g ++ compila questo bene quindi credo che VS è sbagliato

EDIT: non so perché la risposta mo è down-votato. Ma penso che durante la funzione sovraccarico in C ++, la conversione automatica dovrebbe sempre accadere ad un più alto tipo di dati nella conversione di auto è possibile. per esempio: se v'è la possibilità di convertire da in lungo, float e double, dovrebbe sempre fa un int a doppia conversione

.

Ho provato questo in g ++ e sta chiamando la funzione sqrt (doppia).

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

Così uscita typeid () è "d" che significa che ha fatto una conversione automatica da int a raddoppiare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top