Dela via


Kompilatorvarning (nivå 1) C5208 och fel C7626

namnlös klass som används i typedef-namn kan inte deklarera andra medlemmar än icke-statiska datamedlemmar, medlemsuppräkningar eller medlemsklasser

Anmärkningar

Icke namngivna klasser i en typedef deklaration kan inte ha några andra medlemmar än:

  • icke-statiska datamedlemmar utan standardmedleminitierare,
  • medlemsklasser, eller
  • medlemsuppräkningar.

Samma begränsningar tillämpas rekursivt på varje kapslad klass. Begränsningen är avsedd att säkerställa enkelheten i structs som har typedef namn för länkningsändamål. De måste vara tillräckligt enkla för att inga länkningsberäkningar krävs innan kompilatorn kommer till typedef namnet på länkningen.

Den här varningen är ny i Visual Studio 2019 version 16.6. På grundval av P1766R1 som antagits av C++-standardkommittén som en defekt rapport påverkar den kompilatorns alla standardlägen. I standardlägen /std:c++14 och /std:c++17 lägen genererar kompilatorn varning C5208 för kod som inte överensstämmer. Om /permissive- anges genererar kompilatorn varning C5208 som ett fel under /std:c++14. Kompilatorn genererar felet C7626 för icke-överensstämmande kod när /std:c++17 eller senare har angetts.

Inaktivera varningen utan kodändringar

Du kan inaktivera varningen för en specifik kodrad med hjälp warning av pragma, #pragma warning(suppress : 5208). Du kan också inaktivera varningen i en fil med hjälp av varnings pragma, #pragma warning(disable : 5208). Du kan inaktivera varningen globalt i kommandoradsversioner med kommandoradsalternativet /wd5208 .

Så här inaktiverar du varningen för ett helt projekt i Visual Studio IDE:

  1. Öppna dialogrutan Egenskapssidor för projektet. Information om hur du använder dialogrutan Egenskapssidor finns i Egenskapssidor.
  2. Välj sidan Konfigurationsegenskaper>C/C++>Avancerat .
  3. Redigera egenskapen Inaktivera specifika varningar för att lägga till 5208. Välj OK för att tillämpa ändringarna.

Example

I följande exempel visas de konstruktioner som inte längre tillåts i namnlösa strukturer. Beroende på det angivna standardläget genereras C5208- eller C7626-fel eller -varningar:

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;

Koden ovan kan åtgärdas genom att ge den namnlösa klassen ett namn:

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