Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
- Öppna dialogrutan Egenskapssidor för projektet. Information om hur du använder dialogrutan Egenskapssidor finns i Egenskapssidor.
- Välj sidan Konfigurationsegenskaper>C/C++>Avancerat .
- 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;