Heim >Backend-Entwicklung >C++ >Warum tritt der Fehler „Standardelementinitialisierer vor Klassenende erforderlich' auf, wenn ein nicht-trivialer Konstruktor als Standardargument verwendet wird?

Warum tritt der Fehler „Standardelementinitialisierer vor Klassenende erforderlich' auf, wenn ein nicht-trivialer Konstruktor als Standardargument verwendet wird?

DDD
DDDOriginal
2024-10-29 08:04:02802Durchsuche

Why Does

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn