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
Freigeben: 2024-10-29 08:04:02
Original
844 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage