Share via


Upozornění kompilátoru (úroveň 1) C5208 a chyba C7626

Nepojmenovaná třída použitá v názvu typedef nemůže deklarovat členy jiné než statické datové členy, výčet členů nebo třídy členů.

Poznámky

Nepojmenované třídy v deklaraci typedef nemohou mít žádné členy kromě:

  • nestatické datové členy bez výchozích inicializátorů členů,
  • třídy členů, nebo
  • výčet členů.

Stejná omezení se aplikují rekurzivně na každou vnořenou třídu. Cílem omezení je zajistit jednoduchost struktur, které mají typedef názvy pro účely propojení. Musí být dostatečně jednoduché, aby před tím, než se kompilátor dostane k typedef názvu pro propojení, nebyly potřeba žádné výpočty propojení.

Toto upozornění je nové v sadě Visual Studio 2019 verze 16.6. Na základě P1766R1 přijatých výborem standardů C++ jako zprávy o vadách ovlivňuje všechny režimy standardů kompilátoru. Ve výchozím nastavení /std:c++14 a /std:c++17 režimech kompilátor generuje upozornění C5208 pro nevyhovující kód. Pokud /permissive- je zadán, kompilátor vygeneruje upozornění C5208 jako chybu v části /std:c++14. Kompilátor generuje chybu C7626 pro nevyhovující kód, pokud /std:c++17 je zadán nebo novější.

Vypnutí upozornění bez změn kódu

Upozornění pro konkrétní řádek kódu můžete vypnout pomocí direktivy warning pragma, #pragma warning(suppress : 5208). Upozornění můžete také vypnout v souboru pomocí direktivy pragma upozornění . #pragma warning(disable : 5208) Upozornění můžete v sestaveních příkazového řádku globálně vypnout pomocí možnosti příkazového řádku /wd5208 .

Vypnutí upozornění pro celý projekt v integrovaném vývojovém prostředí sady Visual Studio:

  1. Otevřete dialogové okno Stránky vlastností projektu. Informace o použití dialogového okna Stránky vlastností naleznete v tématu Stránky vlastností.
  2. Vyberte stránku Vlastnosti>konfigurace C/C++>Upřesnit.
  3. Upravte vlastnost Disable Specific Warnings pro přidání 5208. Pokud chcete změny použít, zvolte OK .

Příklad

Následující ukázka ukazuje konstrukce, které již nejsou povoleny v nepojmenovaných strukturách. V závislosti na zadaném režimu standardů se vygenerují chyby nebo upozornění C5208 nebo 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;

Výše uvedený kód lze opravit zadáním názvu nepojmenované třídy:

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