Heim >Backend-Entwicklung >C++ >Warum tritt der Fehler „Standardelementinitialisierer vor Klassenende erforderlich' auf, wenn ein nicht-trivialer Konstruktor als Standardargument verwendet wird?
Den Compiler-Fehler „Default Member Initializer Required Before Class End“ verstehen
In diesem Codeausschnitt:
<code class="cpp">#include <cassert> #include <iostream> #include <cstdlib> class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); }; Downloader* Downloader::Create(const Hints &hints) { std::cout << hints.numOfMaxEasyHandles << std::endl; return nullptr; }</code>
Die Fehlermeldung „Standard-Member-Initialisierer vor dem Ende der umschließenden Klasse erforderlich“ wird von Clang- und GCC-Compilern ausgegeben, wenn versucht wird, ein Standardargument zu definieren, das eine Instanz der Strukturhinweise erstellt.
Grund für den Fehler
Dieser Fehler tritt auf, weil das Standardargument für die Create-Funktion ein nicht trivialer Konstruktor ist, der erfordert, dass in der Deklaration der Hints-Struktur ein Standard-Member-Initialisierer definiert wird. Ohne den Member-Initialisierer ist der Compiler nicht in der Lage, die Anfangswerte für das numOfMaxEasyHandles-Member zu ermitteln, wenn ein Standardargument verwendet wird.
Lösung
Um das Problem zu beheben, muss der Die Hints-Struktur sollte einen Standard-Member-Initialisierer wie folgt enthalten:
<code class="cpp">struct Hints { int32_t numOfMaxEasyHandles = 8; Hints() {} // Default member initializer };</code>
Wenn der Standard-Member-Initialisierer vorhanden ist, können sowohl Clang als auch GCC den Code erfolgreich kompilieren. Beachten Sie, dass die Hints-Struktur einen expliziten Standardkonstruktor definieren muss, damit diese Lösung funktioniert.
GCC- und Clang-Fehler
Möglicherweise fällt Ihnen die folgende Zeile auf:
<code class="cpp">Hints() = default;</code>
behebt das Problem für Clang und GCC nicht. Dies ist ein bekannter Fehler in diesen Compilern, bei dem Standard-Member-Initialisierer für nicht-triviale Konstruktoren in bestimmten Kontexten nicht korrekt erkannt werden, beispielsweise wenn der Konstruktor als Standardargument verwendet wird.
Das obige ist der detaillierte Inhalt vonWarum tritt der Fehler „Standardelementinitialisierer vor Klassenende erforderlich' auf, wenn ein nicht-trivialer Konstruktor als Standardargument verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!