Ostrzeżenie kompilatora (poziom 1) C5208 i błąd C7626
nienazwana klasa używana w nazwie typedef nie może deklarować składowych innych niż niestatyczne składowe danych, wyliczenia składowe lub klasy składowe
Uwagi
Nienazwane klasy w typedef
deklaracji nie mogą mieć żadnych elementów członkowskich innych niż:
- niestatyczne składowe danych bez domyślnych inicjatorów składowych,
- klasy składowe lub
- wyliczenia składowych.
Te same ograniczenia są stosowane rekursywnie do każdej zagnieżdżonej klasy. Ograniczenie to ma zapewnić prostotę struktur, które mają typedef
nazwy do celów powiązania. Muszą być na tyle proste, że nie są konieczne żadne obliczenia łączenia, zanim kompilator przejdzie do typedef
nazwy połączenia.
To ostrzeżenie jest nowe w programie Visual Studio 2019 w wersji 16.6. Na podstawie P1766R1 przyjętych przez komitet standardów języka C++ jako raport o wadach, ma wpływ na wszystkie tryby standardów kompilatora. W trybach domyślnych /std:c++14
i /std:c++17
kompilator emituje ostrzeżenie C5208 dla niezgodnego kodu. Jeśli /permissive-
zostanie określony, kompilator emituje ostrzeżenie C5208 jako błąd w obszarze /std:c++14
. Kompilator emituje błąd C7626 dla niezgodnego kodu w przypadku /std:c++17
określenia lub nowszego.
Aby wyłączyć ostrzeżenie bez zmian kodu
Ostrzeżenie dla określonego wiersza kodu można wyłączyć przy użyciu warning
pragma , #pragma warning(suppress : 5208)
. Możesz również wyłączyć ostrzeżenie w pliku przy użyciu ostrzeżenia pragma, #pragma warning(disable : 5208)
. Ostrzeżenie można wyłączyć globalnie w kompilacjach wiersza polecenia przy użyciu opcji wiersza polecenia /wd5208 .
Aby wyłączyć ostrzeżenie dotyczące całego projektu w środowisku IDE programu Visual Studio:
- Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać informacje na temat korzystania z okna dialogowego Strony właściwości, zobacz Strony właściwości.
- Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
- Edytuj właściwość Wyłącz określone ostrzeżenia, aby dodać
5208
element . Wybierz przycisk OK , aby zastosować zmiany.
Przykład
W poniższym przykładzie przedstawiono konstrukcje, które nie są już dozwolone w strukturach bez nazw. W zależności od określonego trybu standardów emitowane są błędy C5208 lub C7626 lub ostrzeżenia:
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;
Powyższy kod można naprawić, nadając nienazwanej klasie nazwę:
struct Base { };
typedef struct NamedType : Base
{
void fn();
static int i;
struct U {
void f();
};
int j = 10;
} S;