C++ error C2668 bei Visual C++ und sqrt() Befehl

bra-tak

Lt. Junior Grade
Registriert
Apr. 2009
Beiträge
449
Hallo,
wollte in Visual C++ 2010 etwa proggen, doch beim Compilieren wurde mir folgender Fheler ausgespuckt:

Code:
1>------ Neues Erstellen gestartet: Projekt: Vektor, Konfiguration: Debug Win32 ------
1>  stdafx.cpp
1>  Vektor.cpp
1>c:\users\martin\documents\visual studio 2010\projects\vektor\vektor\funktionen.h(64): error C2668: 'sqrt': Mehrdeutiger Aufruf einer überladenen Funktion
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(589): kann 'long double sqrt(long double)' sein
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(541): oder "float sqrt(float)"
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(127): oder "double sqrt(double)"
1>          bei Anpassung der Argumentliste '(int)'
1>c:\users\martin\documents\visual studio 2010\projects\vektor\vektor\funktionen.h(65): error C2668: 'sqrt': Mehrdeutiger Aufruf einer überladenen Funktion
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(589): kann 'long double sqrt(long double)' sein
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(541): oder "float sqrt(float)"
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(127): oder "double sqrt(double)"
1>          bei Anpassung der Argumentliste '(int)'
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========

Es handelt sich um diesen Programmteil:

Code:
int LaengenB(int c[3],int f[3]) {
    double Laenge_1=sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]);
    double Laenge_2=sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);
    cout << "Die Länge des ersten Vektors beträgt:" << Laenge_1 << endl;
    cout << "Die Länge des zweiten Vektors beträgt:" << Laenge_2 << endl;
    cout << "" << endl;
    return 0;
}

weiß jemand was da schief gelaufen ist?
 
Du musst einfach deine Werte in der sqrt Funktion casten.
Code:
sqrt((double)(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]));

Dann sollte die Mehrdeutigkeit verschwunden sein.
 
Jo.


Für den Compiler kommt aus dem Term c[0]*c[0]+c[1]*c[1]+c[2]*c[2] erst mal als Ergebnis eine Integer-Zahl heraus, da c als int deklariert wurde (analog mit f). Aus einer Integer kann allerdings keine Wurzel gezogen werden. Jedenfalls ist hier dafür keine Funktion bekannt. Dafür kann er aber aus Gleitkommazahlen die Wurzel ziehen.

"Nun, kein Problem," denkt sich der Compiler und will die Integer-Zahl in eine Gleitkommazahl umwandeln. Er kann sich aber nicht zwischen float, double und long double entscheiden kann. Und deswegen kommt die Fehlermeldung.
 
Zuletzt bearbeitet:
Bitte empfehlt den Leuten nicht immer C-style casts, wenn sie ganz offensichtlich in C++ programmieren.

Code:
sqrt( static_cast < double > ( c[0] * c[0] + c[1] * c[1] + c[2] * c[2] ) );


e-Laurin schrieb:
Er kann sich aber nicht zwischen float, double und float double entscheiden kann.

float double? Bestimmt meinst du long double? ;)
 
Zurück
Oben