Поделиться через


Предупреждение компилятора (уровень 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, выполните следующие действия.

  1. Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
  2. Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
  3. Измените свойство 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;