Partilhar via


Aviso do compilador (nível 1) C5208 e erro C7626

a classe sem nome usada no nome de typedef não pode declarar membros que não sejam classes de membro, enumerações de membro ou membros de dados não estáticos

Comentários

Classes sem nome em uma declaração typedef não podem ter nenhum membro que não seja:

  • membros de dados não estáticos sem inicializadores de membro padrão,
  • classes de membro, ou
  • enumerações de membro.

As mesmas restrições são aplicadas recursivamente a cada classe aninhada. A restrição destina-se a garantir a simplicidade de structs que têm nomes typedef para fins de vinculação. Eles devem ser simples o suficiente para que nenhum cálculo de vinculação seja necessário antes que o compilador chegue ao nome typedef da vinculação.

Este aviso é novo no Visual Studio 2019 versão 16.6. Com base no P1766R1 adotado pelo comitê de padrões do C++ como um relatório de defeito, ele afeta todos os modos padrão do compilador. Em modos /std:c++14 e /std:c++17 padrão, o compilador emite o aviso C5208 para código não conforme. Se /permissive- for especificado, o compilador emitirá o aviso C5208 como um erro em /std:c++14. O compilador emite o erro C7626 para código não conforme quando /std:c++17 ou posterior é especificado.

Para desativar o aviso sem alterações de código

Você pode desativar o aviso em uma linha de código específica usando o pragma warning, #pragma warning(suppress : 5208). Você também pode desativar o aviso dentro de um arquivo usando o pragma de aviso, #pragma warning(disable : 5208). Para desativar o aviso globalmente em builds de linha de comando, use a opção de linha de comando /wd5208.

Para desativar o aviso de um projeto inteiro no IDE do Visual Studio:

  1. Abra a caixa de diálogo Páginas de Propriedades do seu projeto. Para obter informações sobre como usar a caixa de diálogo Páginas de Propriedades, consulte Páginas de Propriedades.
  2. Selecione a página Propriedades de Configuração>C/C++>Avançadas.
  3. Edite a propriedade Desabilitar Avisos Específicos para adicionar 5208. Escolha OK para aplicar suas alterações.

Exemplo

O exemplo a seguir mostra os constructos que não são mais permitidos em structs sem nome. Dependendo do modo de padrões especificado, são emitidos erros ou avisos C5208 ou 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;

O código acima pode ser corrigido dando um nome à classe sem nome:

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