Предупреждение компилятора (уровень 1) C5208 и ошибка C7626
Неименованный класс, используемый в имени typedef, не может объявлять элементы, отличные от нестатических элементов данных, перечислений членов или классов элементов
Замечания
Неименованные классы в объявлении typedef
не могут содержать никаких элементов, кроме:
- нестатические элементы данных без инициализаторов элементов по умолчанию;
- классы элементов;
- перечисления элементов.
Те же ограничения применяются рекурсивно к каждому вложенному классу. Ограничение должно обеспечить простоту структур с именами typedef
для связывания. Они должны быть достаточно простыми, чтобы не нужно было вычислять связывания до того, как компилятор дойдет до имени typedef
для связывания.
Это предупреждение новое в Visual Studio 2019 версии 16.6. На основе P1766R1, принятых комитетом по стандартам C++ в качестве отчета о дефектах, он влияет на все режимы стандартов компилятора. По умолчанию /std:c++14
и /std:c++17
режимах компилятор выдает предупреждение C5208 для несоответствующего кода. Если /permissive-
задано, компилятор выдает предупреждение C5208 в качестве ошибки /std:c++14
. Компилятор выдает ошибку C7626 для несоответствующего кода при /std:c++17
указании или более поздней версии.
Отключение предупреждения без изменений кода
Предупреждение для определенной строки кода можно отключить с помощью warning
pragma. #pragma warning(suppress : 5208)
Вы также можете отключить предупреждение в файле с помощью предупреждения pragma. #pragma warning(disable : 5208)
Вы можете отключить предупреждение глобально в сборках командной строки с помощью параметра командной строки /wd5208 .
Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.
- Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
- Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
- Измените свойство Disable Specific Warnings to add
5208
. Нажмите кнопку "ОК ", чтобы применить изменения.
Пример
В приведенном ниже примере показаны конструкции, которые теперь нельзя использовать в безымянных структурах. В зависимости от указанного режима соответствия стандартам, выдаются ошибки или предупреждения C5208 или 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;
Приведенный выше код можно исправить, присвоив безымянному классу имя:
struct Base { };
typedef struct NamedType : Base
{
void fn();
static int i;
struct U {
void f();
};
int j = 10;
} S;