Avviso del compilatore (livello 1) C5208 ed errore C7626

La classe senza nome utilizzata nel nome typedef non può dichiarare membri diversi dai membri dati non statici, dalle enumerazioni dei membri o dalle classi membro

Osservazioni:

Le classi senza nome all'interno di una typedef dichiarazione non possono avere membri diversi da:

  • membri dati non statici senza inizializzatori di membri predefiniti,
  • classi membro o
  • enumerazioni membro.

Le stesse restrizioni vengono applicate in modo ricorsivo a ogni classe annidata. La restrizione è destinata a garantire la semplicità degli struct con typedef nomi per scopi di collegamento. Devono essere sufficientemente semplici da non essere necessari calcoli di collegamento prima che il compilatore ottenga il nome per il typedef collegamento.

Questo avviso è una novità di Visual Studio 2019 versione 16.6. In base alle P1766R1 adottate dal comitato degli standard C++ come report sui difetti, influisce su tutte le modalità standard del compilatore. Nelle modalità predefinite /std:c++14 e /std:c++17 il compilatore genera l'avviso C5208 per il codice non conforme. Se /permissive- viene specificato, il compilatore genera l'avviso C5208 come errore in /std:c++14. Il compilatore genera l'errore C7626 per il codice non conforme quando /std:c++17 viene specificato o versione successiva.

Per disattivare l'avviso senza modifiche al codice

È possibile disattivare l'avviso per una riga di codice specifica usando il warning pragma , #pragma warning(suppress : 5208). È anche possibile disattivare l'avviso all'interno di un file usando il pragma di avviso , #pragma warning(disable : 5208). È possibile disattivare l'avviso a livello globale nelle compilazioni della riga di comando usando l'opzione della riga di comando /wd5208 .

Per disattivare l'avviso per un intero progetto nell'IDE di Visual Studio:

  1. Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per informazioni su come usare la finestra di dialogo Pagine delle proprietà, vedere Pagine delle proprietà.
  2. Selezionare la pagina Proprietà>di configurazione C/C++>Avanzate.
  3. Modificare la proprietà Disabilita avvisi specifici per aggiungere 5208. Scegliere OK per applicare le modifiche.

Esempio

L'esempio seguente illustra i costrutti che non sono più consentiti in struct senza nome. A seconda della modalità standard specificata, vengono generati errori o avvisi C5208 o C7626:

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;

Il codice precedente può essere corretto assegnando alla classe senza nome un nome:

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