Mein Code ist wie folgt:
%Vor% Der Aufruf in der letzten Zeile wird auch mit -pedantic -std=c++98 -Wall -Wextra
nicht mehrdeutig gemeldet, funktioniert aber in anderen Compilern nicht unbedingt, aus dem gleichen Grund foo(i)
nicht.
gcc fügt dem Namensraum std
Folgendes hinzu:
Das heißt, es fügt inline double sqrt(X)
für alle Integer-Typen X hinzu.
Ich schätze es, dass g ++ sein Bestes tut, um mir zu helfen, aber gibt es irgendeine (legitime) Möglichkeit, den Fehler in meinem Code zu diagnostizieren?
[Bearbeiten: Ich benutze gcc 4.3.4, aber wenn andere Versionen von gcc es diagnostizieren können, interessiert mich das auch!]
Dieser "hilfreiche" Standardbibliothekszusatz von GCC ist nicht konform in C ++ 03, nach [lib.global.functions] / 2 :
Ein Aufruf einer globalen Funktionssignatur [beschrieben in der Standardbibliotheksdefinition] verhält sich genauso, als ob die Implementierung keine zusätzlichen globalen Funktionssignaturen deklariert.
Dies bedeutet, dass die Implementierung (gcc) keine zusätzlichen Überladungen hinzufügen darf (hilfreich oder nicht), solange sie das beobachtbare Verhalten des Programms beeinflussen.
Sie möchten das Zitat aus dem FDIS?
Letzter Absatz vom 26.8:
Darüber hinaus müssen zusätzliche Überlastungen vorhanden sein, um Folgendes sicherzustellen:
Wenn ein Argument, das einem Parameter
double
entspricht, den Typlong double
hat, werden alle Argumente, die den Parameterndouble
entsprechen, effektiv inlong double
umgewandelt.Andernfalls, wenn ein Argument, das einem
double
-Parameter entspricht, den Typdouble
oder einen Integertyp hat, werden alle Argumente, diedouble
-Parametern entsprechen, effektiv indouble
umgewandelt.Andernfalls werden alle Argumente, die den
double
-Parametern entsprechen, effektiv infloat
umgewandelt.
In diesem Fall muss Punkt 2 gelten.
Tags und Links c++ gcc overloading sqrt