Strikter C++-Compiler - Auflösung der Funktionsüberladung

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Strikter C++-Compiler (Appmethod C++) - Index

Einer der Bereiche, in denen sich der Appmethod C++ 2007-Compiler am meisten von den früheren Versionen unterscheidet, ist die Auflösung der Funktionsüberladung. Dazu gehört auch das Erkennen von Mehrdeutigkeit. Der Compiler entspricht nun genau den Regeln in Abschnitt 13.3 des 2003 C++ ANSI-Standards. Konstrukte, die früher zulässig waren, können jetzt als mehrdeutig oder als 'Keine Übereinstimmung' eingestuft werden. Daher müssen Sie den Quelltext so ändern, dass Ihre Absicht klar wird.

Mit dem Compiler-Schalter -Vbo können Sie auf das frühere Verhalten zurückgreifen. Allerdings lassen sich nicht alle Änderungen am Compiler über diesen Schalter steuern. Embarcadero empfiehlt Ihnen, stattdessen den Code zu aktualisieren.

Die Mehrdeutigkeit im folgenden Beispiel wurde vom vorherigen Compiler nicht beanstandet:

class X{}; void foo(X); void foo(const X&); void ambig() { X x; foo(x); //Fehler – Mehrdeutig – Vorheriger Compiler wählte 'void foo(x)' }

Mehrdeutigkeit von std::abs

Die Standardfunktion abs kann auch eine Mehrdeutigkeitsmeldung erzeugen, wenn sie mit einem Parameter aufgerufen wird, der nicht genau den Typen entspricht, die von den verschiedenen überladenen Versionen von abs erwartet werden. Dazu ein Beispiel:

#include <limits>bool test(long l) {   gibt std::abs(l)> 0; zurück } 

Der obige Quelltext erzeugt einen Compiler-Fehler und eine Warnung:

Fehler E2015 test.cpp 5: Mehrdeutigkeit zwischen 'std::abs(int) in C:\dev\tp\sc\include\math.h:208' und 'std::abs(long double) in C:\dev\tp\sc\include\math.h:275' in Funktion test(long) Warnung W8057 test.cpp 6: Parameter 'l' wird nie verwendet in Funktion test(long)

Um dies zu beheben, wandeln Sie in den Typ der überladenen Funktion um, die aufgerufen werden soll. Zum Beispiel:

  #include <limits>bool test(long l) {   gibt std::abs(static_cast<int>(l)) > 0; zurück }


Siehe auch