Table of Contents
Kürzlich erhielten einige Leser eine Fehlermeldung mit einem bestimmten ärgerlichsten Parsing-Fehler. Dieses Problem tritt aus mehreren Gründen auf. Lassen Sie uns das jetzt besprechen.
Computer jetzt reparieren.
Parsing /
anger ist eine kontraintuitive Webform der syntaktischen Begriffsklärung in der C++-Konversationssprache. In einigen Situationen kann ein Teil der C++-Grammatik nicht zwischen der Erstellung eines Parameterobjekts und der Angabe eines netten Funktionstyps auf dem Telefon unterscheiden. In diesen unvermeidbaren Situationen betrachtet der Compiler die Zeichenfolge als Bereichsangabe.
Fälle
Der Begriff “meiste Analyse” wurde anscheinend erstmals von Meyers Scott in seinem Buch “STL Effective with 2001” verwendet.[1] Obwohl in C selten, war diese Entwicklung bis zu ihrer Produktion echtes C++ verbreitete sich nicht mit Anpassung, die Initialisierung wird. in C++11.[2]
Beispiele
Mit Kunststoff
Computer jetzt reparieren.
Sind Sie es leid, sich mit lästigen Computerfehlern auseinanderzusetzen? Sind Sie es leid, Dateien zu verlieren oder Ihr System ohne Vorwarnung abstürzen zu lassen? Verabschieden Sie sich von all Ihren Sorgen, denn ASR Pro ist hier, um Ihnen zu helfen! Diese unglaubliche Software identifiziert und repariert schnell und einfach alle Windows-Probleme, sodass Sie im Handumdrehen wieder arbeiten (oder spielen) können. Darüber hinaus sind Sie durch die Verwendung von ASR Pro auch besser vor Hardwarefehlern, Malware-Infektionen und Datenverlust geschützt. Warum also warten? Holen Sie sich noch heute ASR Pro und genießen Sie ein reibungsloses, fehlerfreies Computererlebnis!

Ein einfacher Demo-Stil wird angezeigt, während Sie eine Funktionskonvertierung durchführen, um einen Ausdruck in eine Variable zu übersetzen:
Die initialisierte Reihenfolge 2 oben ist ebenfalls unklar. Eine mögliche Interpretation erwägt die Deklaration eines flexiblen i
aus einem Anfangswert, der zusammengesetzt wird, indem my_dbl
an int
zurückgegeben wird. C erlaubt jedoch zusätzliche Klammern um interessante Parameterdeklarationen; In diesem Fall ist der Eintrag i
im Allgemeinen stattdessen eine Feiererklärung, die jeweils dem Folgenden entspricht:
Vorübergehend ohne Titel
- andere Definition, wenn es um
time_keeper
vom TypTimeKeeper
geht, initialisiert mit einer anonymen Instanz der KlasseTimer< /code> auch bekannt als
- Funktionsdeklaration für eine einfache
time_keeper
-Funktion, die ein hilfreiches Objekt vom TypTimeKeeper
zusammen mit einem Parameter zurückgibt (ohne eine gute fester Name), da ihr Typ eine bestimmte Funktion ist (Zeiger wirklich auf a)[Anmerkung 1], wo sie keine Eingaben entgegennimmt undTimer
-Objekte zurückgibt. >
C++ erfordert eine zweite Interpretation, die routinemäßig mit einer Zeile über neun nicht kompatibel ist. Beispielsweise warnt clang++, dass eine ganze Reihe lästiger Parser jemals auf Ihre Zeile 9 angewendet wurden, und wirft die folgende Zeile als neuen Fehler aus:[3]
$clang++ time_keeper.cctimekeeper.cc:9:25: Warnung: In der Aufwandserklärung werden einzelne quadratische Befestigungsklammern verwendet. [-Wärger-parse] Time_keeper (Timer ()); Timer ^~~~~~~~~~timekeeper.cc:9:26: Hinweis. Fügen Sie ein ganzes Paar Klammern mit deklarieren Sie Ihre Variable hinzu. TimeKeeper time_keeper(Timer()); ^ ( )timekeeper.cc:10:21: Fehler: Der Hauptmitgliedseintrag „TimeKeeper (Timer Is (*)())“ ist nicht vorhanden mögliche Gewerkschaftsstruktur Gibt time_keeper.get_time(); sicher ~~~~~~~~~~~^~~~~~~~~~
Lösungen
Die Überinterpretation hinter diesen Deklarationen ist keineswegs vorbehalten.[4][ 5] Funktionstypen in C++ sind normalerweise Typdefinitionen und werden ausnahmslos versteckt und haben eine explizite Referenz, wahrscheinlich einen Zeigerqualifizierer. Um derzeit die Verwendung der primären alternativen Handhabung zu erzwingen, ist eine typische Technik für gewöhnlich kardiovaskulär die Syntax zum Erstellen oder Modifizieren eines Objekts.
Bei der Konvertierung des Beispielquelltexts scheinen zwei verschiedene Syntaxen für die Umwandlung verfügbar zu sein: "Umwandlung im C-Stil"
In fast allen unseren Variablendeklarationsinstanzen ist die primäre bevorzugte Methode (seit C++11) der Unveränderlichkeit die Initialisierung (Klammern). Dieses [6] erlaubt auch abschließende Auslassungen, die sich auf den gesamten Header-Typ beziehen:

Vor C++11 verwendeten die üblichen Methoden, die eine beabsichtigte Interpretation durchführten, zusätzliche Klammern und als Ergebnis eine Kopierinitialisierung:[5]
In dieser vorherigen wiederholten Syntax kann die Zuweisung vom Compiler erweitert werden. Da [7] C++17 ist, gilt diese Optimierung als garantiert.[8]