Frage

darf nicht der Compiler wirft automatisch zu einem Doppel in den folgenden? Zumindest nach 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
War es hilfreich?

Lösung

Das Problem ist, dass es drei Versionen von sqrt zur Auswahl:

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

Da Sie in einem int vorbei sind, der Compiler wird Ihr Argument zu fördern, aber es ist ebenso gültig Ihre ganze Zahl auf eine der oben genannten Arten zu fördern, so dass es nicht eindeutig ist.

Sie können dieses Problem beheben, indem Sie einfach explizit auf eine der oben genannten Arten Gießen, wie in:

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

Andere Tipps

Mehrdeutige Anruf Fehler ist, dass es nicht weiß, welche Funktion nicht zu nennen, dass es nicht implizit konvertieren.

Blick auf die folgende. Wenn ich schaffe meine eigene Funktion, die eine doppelte nimmt und gibt ein Doppel es hat implizit kein Problem zu konvertieren. Da Ihre ganze Zahl kann auf drei verschiedenen Überlastungen umgewandelt wird es nicht weiß, was zu nennen.

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

Allerdings, wenn ich eine andere Version von mysqrt hinzufügen, die einen Schwimmer nimmt ich einen mehrdeutigen Aufruf Fehler erstellen.

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

Da gibt es mehrere sqrt Funktionen (Überlastungen) und mehr als 1 kann einen int als Parameter akzeptieren, ohne Präzision zu verlieren ist es an Ihnen angeben, welche (und das ist eine gute Sache, weil Sie den Compiler nicht für Sie basiert auf ‚Indizien‘ Beweise Entscheidungen wollen - einen int zu sqrt vorbei ).

C liefert immer die doppelte Version, es sei denn sqrtf genannt wird.

Versuchen Sie Ihren Anruf mit (double) Gießen

Aus der MSDN: [

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

] 1

Es gibt mehrere Überlastungen std :: sqrt in cmath. Man nimmt einen Schwimmer und ein anderer nimmt eine doppelte. Der Compiler kann nicht wissen, welche Sie angerufen werden möchten, und ints können in einer von ihnen geworfen werden.

In Abwesenheit der zusätzlichen Überlastungen, würde es automatisch auf doppelten cast [dies der Fall in C] wie erwartet.

Ja, Es sollte automatisch von int nach double gegossen. g ++ kompiliert diese feine also denke ich, VS falsch

EDIT: nicht sicher, warum mo Antwort ist nach unten gestimmt. Aber ich denke, während Funktion in C ++ eine Überlastung, die automatische Konvertierung immer zu einem höchsten Datentyp in der Auto-Umwandlung passieren soll möglich ist. für ex: Wenn es eine Option in zu lange, float und double zu konvertieren, sollte es tut immer einen int zu Doppelwandler

.

Ich habe versucht, dies in g ++ und es ruft sqrt (double) Funktion.

#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 Ausgabe von typeid () ist „d“, die Mittel es eine automatische Konvertierung von int getan hat zu verdoppeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top