Compilerwarnung (Ebene 1) C5208 und Fehler C7626

Unnamed class used in typedef name cannot declare members than non-static data members, member enumerations, or member classes

Hinweise

Unbenannte Klassen innerhalb einer typedef Deklaration können keine anderen Member haben als:

  • Nicht statische Datenmitglieder ohne Standard-Memberinitialisierer,
  • Memberklassen oder
  • Memberenumerationen.

Dieselben Einschränkungen gelten rekursiv für alle geschachtelten Klassen. Durch diese Einschränkung soll die Einfachheit von Strukturen mit typedef-Namen zu Bindungszwecken sichergestellt werden. Sie müssen so einfach sein, dass keine Bindungsberechnungen erforderlich sind, bevor der Compiler den typedef-Namen für die Bindung erreicht.

Diese Warnung ist neu in Visual Studio 2019, Version 16.6. Basierend auf P1766R1 , die vom C++-Standardsausschuss als Fehlerbericht angenommen wurden, wirkt es sich auf alle Standardmodi des Compilers aus. In Standard /std:c++14 - und /std:c++17 Modi gibt der Compiler die Warnung C5208 für nicht konformen Code aus. Wenn /permissive- angegeben, gibt der Compiler die Warnung C5208 als Fehler aus /std:c++14. Der Compiler gibt den Fehler C7626 für nicht konformen Code aus, wenn /std:c++17 oder höher angegeben wird.

So deaktivieren Sie die Warnung ohne Codeänderungen

Sie können die Warnung für eine bestimmte Codezeile mithilfe des warning Pragmas #pragma warning(suppress : 5208)deaktivieren. Sie können die Warnung in einer Datei auch mit dem Pragma #pragma warning(disable : 5208)der Warnung deaktivieren. Sie können die Warnung global in Befehlszeilenbuilds deaktivieren, indem Sie die Befehlszeilenoption "/wd5208 " verwenden.

So deaktivieren Sie die Warnung für ein gesamtes Projekt in der Visual Studio-IDE:

  1. Öffnen Sie das Dialogfeld "Eigenschaftenseiten " für Ihr Projekt. Informationen zur Verwendung des Dialogfelds "Eigenschaftenseiten" finden Sie unter "Eigenschaftenseiten".
  2. Wählen Sie die Seite "Konfigurationseigenschaften>C/C++>Erweitert" aus.
  3. Bearbeiten Sie die Eigenschaft "Bestimmte Warnungen deaktivieren", um sie hinzuzufügen 5208. Wählen Sie "OK" aus, um Ihre Änderungen anzuwenden.

Beispiel

Das folgende Beispiel zeigt die Konstrukte, die in unbenannten Strukturen nicht länger zulässig sind. Abhängig vom angegebenen Standardmodus werden die Fehler oder Warnungen C5208 bzw. C7626 ausgegeben:

struct Base { };
typedef struct : Base // inheriting from 'Base'; ill-formed
{
    void fn(); // ill-formed
    static int i; // ill-formed
    struct U {
        void f(); // nested class has non-data member; ill-formed
    };
    int j = 10; // default member initializer; ill-formed
} S;

Der obige Code kann korrigiert werden, indem Sie der unbenannten Klasse einen Namen zuweisen:

struct Base { };
typedef struct NamedType : Base
{
    void fn();
    static int i;
    struct U {
        void f();
    };
    int j = 10;
} S;