Bug in Dev-CPP
-
Ich hab mal ne Frage:
Ich habe mir vorhin eine eigene pow-Funktion geschrieben, und wollte die in deinem Programm benutzen, dass ich mit Dev-Cpp geschrieben habe:
Beispiel-Programm:
#include <iostream> using namespace std; int pow (int a, int b) { return(a*b-3); } int main(void) { cout << pow(2,3.3); cout << static_cast<int>(1.0)*static_cast<int>(3.3)-3; cin.get(); return (0); }
Dann gibt der folgende Fehler aus:
11 C:[...]\main.cpp call of overloaded `pow(int, double)' is ambiguous
error C:[...]\Dev-Cpp\include\math.h:149 candidates are: double pow(double, double)
5 C:[...]\main.cpp int pow(int, int)
512 C:\Programme\Dev-Cpp\include\c++\3.3.1\cmath long double std::pow(long double, int)
.... Hier gehts dann noch ein bisschen weiter mit ein paar anderen pow-Funktionen
ABER ich habe ja gar keine Header ausser iostream eingebunden. Wieso tut der dann so, als ob ich cmath eingebunden hätte??
Mfg
Felix
-
ich kann dir auch nicht sagen welche header das genau sind, aber der dev-cpp bindet mehrere header ein, ohne dass man es explizit angeben muss. ich kann mich nur noch erinnern, dass man z.b. std::string benutzen kann, ohne <string> zu inkludieren.
um dein problem zu loesen, muesstest du using namespace std; entfernen und er muesste deine funktion aus dem globalen namespace nehmen. eine alernative waere ::pow zu schreiben.mfg,
google
-
Hm kann man das nicht irgendwie ausstellen? Ich meine, dass der macnhe header einfach so einbindet, obwohl man das nicht explizit sagt?
Schonmal Danke
Felix
-
Das Problem ist nicht, dass hier ein Header drin ist, den Du nicht brauchst, sondern dass Du eine Funktion überladen willst, die schon im namespace std existiert. Um Deine Funktion anzusprechen ist das bereits erwähnte ::pow das Mittel der Wahl. Und dann wirst Du noch ein weiteres Problem haben: Deine Funktion erwartet nämlich zwei Integer-Werte, Du übergibst aber einen float-Wert. Ausserdem ist es nicht ratsam, eine Funktion zu überladen, und ihr eine komplett andere Funktionalität zu verpassen: std::pow berechnet Potenzen. Und Deine Formel a*b-3 berechnet irgendwas anderes. Solche Dinge machen den Code für andere schwer lesbar, und darum ist es besser, der Funktion einen anderen, passenden Namen zu geben, der noch nicht belegt ist.
-
Phoemuex schrieb:
Hm kann man das nicht irgendwie ausstellen? Ich meine, dass der macnhe header einfach so einbindet, obwohl man das nicht explizit sagt?
Schonmal Danke
Felix
wenn du z.b. iostream einbindest, dann muss iostream selbst logischerweise alle header einbinden, die es braucht, um alle funktionen bereitzustellen, die mit anderen teilen der Standard C++ library zu tun haben. <cmath> könnte z.b. benötigt werden, um formatierungsfunktionen für float/double etc. zu erlauben. analog ist es mit <string>. das bedeutet aber nicht notwendigerweise, dass iostream tatsächlich den gesamten <string> oder <cmath> header einbindet, möglicherweise benutzt es nur einen teil davon über die interen header der library. insofern ist es falsch, sich im program darauf zu verlassen. prinzipiell sollte man alle header, von denen man funktionalität direkt braucht, auch explizit inkludieren. ausserdem muss jedes standardkonforme programm auch funktionieren, wenn man alle standardheader einbindet, ob man sie nun braucht oder nicht.
das eigentliche problem ist das using namespace std; dass erst die mehrdeutigkeit des funktionsaufrufes bewirkt. üblicherweise wird davon abgeraten, durch using ganze namespaces sichtbar zu machen, anstatt nur einzelne elemente davon.
-
Deine Funktion erwartet zwei integer als Parameter. Du übergibst aber einen Integer und einen Double!
-
Deine Funktion erwartet nämlich zwei Integer-Werte, Du übergibst aber einen float-Wert. Ausserdem ist es nicht ratsam, eine Funktion zu überladen, und ihr eine komplett andere Funktionalität zu verpassen: std::pow berechnet Potenzen. Und Deine Formel a*b-3 berechnet irgendwas anderes. Solche Dinge machen den Code für andere schwer lesbar, und darum ist es besser, der Funktion einen anderen, passenden Namen zu geben, der noch nicht belegt ist.
Also das hab ich nur als Beispiel gemacht, weil ich nicht die ganze Funktions-Definition hier hin schreiben wollte. Bei meiner Version berechnet die Funktion pow() natürlich Potenzen (nur halt von Integern). Das mit dem float und dem int habe ich gemacht, weil der Compiler ja sonst nicht wegen einer Zweideutigkeit meckert.
Das Problem ist nicht, dass hier ein Header drin ist, den Du nicht brauchst, sondern dass Du eine Funktion überladen willst, die schon im namespace std existiert.
Die Funktion pow ist aber nur im namespace std deklariert, wenn ich auch den Header cmath oder math.h einbinde, was ich ja mit Absicht vermieden habe.
wenn du z.b. iostream einbindest, dann muss iostream selbst logischerweise alle header einbinden, die es braucht, um alle funktionen bereitzustellen, die mit anderen teilen der Standard C++ library zu tun haben. <cmath> könnte z.b. benötigt werden, um formatierungsfunktionen für float/double etc. zu erlauben.
Stimmt. Danke darauf wäre ich nicht so schnell gekommen. Ich habe einfach mal das ganze kompiliert, ohne iostream einzubinden (natürlich dann auch ohne cout und cin) und dann klappt es auf einmal.
Vielen Dank!
Felix