Delen via


Compilerwaarschuwing (niveau 1) C5208 en fout C7626

niet-benoemde klasse die wordt gebruikt in de typedef-naam, kan geen andere leden dan niet-statische gegevensleden, lidinventarisaties of lidklassen declareren

Opmerkingen

Niet-benoemde klassen in een typedef declaratie mogen geen andere leden hebben dan:

  • niet-statische gegevensleden zonder standaard initialisatieprogramma's voor leden,
  • ledenklassen of
  • opsommingen van leden.

Dezelfde beperkingen worden recursief toegepast op elke geneste klasse. De beperking is bedoeld om de eenvoud van structs met typedef namen voor koppelingsdoeleinden te waarborgen. Ze moeten eenvoudig genoeg zijn dat er geen koppelingsberekeningen nodig zijn voordat de compiler de typedef naam voor koppeling krijgt.

Deze waarschuwing is nieuw in Visual Studio 2019 versie 16.6. Op basis van P1766R1 die door het C++-normencomité als defectrapport zijn aangenomen, is dit van invloed op alle standaardenmodi van de compiler. In de standaardmodus /std:c++14 en /std:c++17 modi verzendt de compiler waarschuwing C5208 voor niet-conforme code. Als /permissive- dit is opgegeven, verzendt de compiler waarschuwing C5208 als een fout onder /std:c++14. De compiler verzendt fout C7626 voor niet-conforme code wanneer /std:c++17 of hoger is opgegeven.

De waarschuwing uitschakelen zonder codewijzigingen

U kunt de waarschuwing voor een specifieke coderegel uitschakelen met behulp van de warning pragma. #pragma warning(suppress : 5208) U kunt de waarschuwing in een bestand ook uitschakelen met behulp van de waarschuwingspragma. #pragma warning(disable : 5208) U kunt de waarschuwing globaal uitschakelen in opdrachtregel-builds met behulp van de opdrachtregeloptie /wd5208 .

De waarschuwing voor een volledig project uitschakelen in de Visual Studio IDE:

  1. Open het dialoogvenster Eigenschappenpagina's voor uw project. Zie Eigenschappenpagina's voor meer informatie over het gebruik van het dialoogvenster Eigenschappenpagina's.
  2. Selecteer de pagina Configuratie-eigenschappen>C/C++>Geavanceerd .
  3. Bewerk de eigenschap Specifieke waarschuwingen uitschakelen om toe te voegen 5208. Kies OK om uw wijzigingen toe te passen.

Example

In het volgende voorbeeld ziet u de constructies die niet meer zijn toegestaan in niet-benoemde structs. Afhankelijk van de opgegeven standaardenmodus worden C5208- of C7626-fouten of waarschuwingen verzonden:

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;

De bovenstaande code kan worden opgelost door de niet-benoemde klasse een naam te geven:

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