Verstehen des Compiler-Fehlers: „Standard-Member-Initialisierer vor dem Ende seiner umschließenden Klasse erforderlich“
Dieses Problem tritt auf, wenn versucht wird, a zu definieren Standard-Member-Initialisierer für ein Klassenmitglied innerhalb einer Funktion, die diese Klasse als Standardargumentwert verwendet. Compiler wie gcc und clang stoßen auf Schwierigkeiten mit diesem Konstrukt, während msvc2017 es erfolgreich verarbeitet.
Beachten Sie den folgenden Codeausschnitt:
<code class="cpp">class Downloader { public: struct Hints { int32_t numOfMaxEasyHandles = 8; }; static Downloader *Create(const Hints &hints = Hints()); };</code>
Der bereitgestellte Code soll einen Standardwert für numOfMaxEasyHandles definieren Mitglied der Hints-Struktur, das als Standardargument in der Create-Funktion verwendet wird. Allerdings können gcc und clang diesen Code nicht kompilieren und geben den folgenden Fehler aus:
default member initializer for 'Downloader::Hints::numOfMaxEasyHandles' required before the end of its enclosing class
Grund für den Fehler
Dieser Fehler tritt aufgrund eines Fehlers in gcc und auf clang im Zusammenhang mit der Handhabung von Standard-Member-Initialisierern innerhalb von Klassen, die als Standardargumente in Funktionen verwendet werden. Die Compiler erwarten, dass der Standard-Member-Initialisierer innerhalb der Klassendefinition selbst und nicht innerhalb des Funktionskörpers definiert wird.
Mögliche Problemumgehungen
Um dieses Problem zu beheben, gibt es zwei mögliche Problemumgehungen:
Das obige ist der detaillierte Inhalt vonWarum werfen GCC und Clang „Default Member Initializer Required' aus, wenn sie eine Klasse als Standardargument verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!