Partager via


Avertissement du compilateur (niveau 1) C5208 et Erreur C7626

La classe unnamed utilisée dans le nom typedef ne peut pas déclarer des membres autres que des membres de données non statiques, des énumérations de membres ou des classes de membres

Notes

Les classes sans nom dans une typedef déclaration ne peuvent pas avoir d’autres membres que :

  • membres de données non statiques sans initialiseurs membres par défaut,
  • classes membres, ou
  • énumérations membres.

Les mêmes restrictions sont appliquées de manière récursive à chaque classe imbriquée. La restriction est destinée à garantir la simplicité des structs qui ont des noms typedef à des fins de liaison. Ils doivent être suffisamment simples pour qu’aucun calcul de liaison ne soit nécessaire avant que le compilateur accède au nom typedef pour la liaison.

Cet avertissement est nouveau dans Visual Studio 2019 version 16.6. Sur la base de P1766R1 adoptée par le comité des normes C++ en tant que rapport de défauts, elle affecte tous les modes de normes du compilateur. Dans les modes par /std:c++17 défaut/std:c++14, le compilateur émet un avertissement C5208 pour le code non conforme. Si /permissive- elle est spécifiée, le compilateur émet l’avertissement C5208 en tant qu’erreur sous /std:c++14. Le compilateur émet l’erreur C7626 pour le code non conforme quand /std:c++17 ou une version ultérieure est spécifiée.

Pour désactiver l’avertissement sans modification du code

Vous pouvez désactiver l’avertissement pour une ligne de code spécifique à l’aide du warning pragma. #pragma warning(suppress : 5208) Vous pouvez également désactiver l’avertissement dans un fichier à l’aide du pragma #pragma warning(disable : 5208)d’avertissement. Vous pouvez désactiver l’avertissement globalement dans les builds de ligne de commande à l’aide de l’option de ligne de commande /wd5208 .

Pour désactiver l’avertissement d’un projet entier dans l’IDE Visual Studio :

  1. Ouvrez la boîte de dialogue Pages de propriétés de votre projet. Pour plus d’informations sur l’utilisation de la boîte de dialogue Pages de propriétés, consultez Pages de propriétés.
  2. Sélectionnez la page Propriétés>de configuration C/C++>Avancé.
  3. Modifiez la propriété Disable Specific Warnings pour ajouter 5208. Choisissez OK pour appliquer vos modifications.

Exemple

L’exemple suivant montre les constructions qui ne sont plus autorisées dans des structs non nommés. Selon le mode standard spécifié, des erreurs ou avertissements C5208 ou C7626 sont émis :

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;

Le code ci-dessus peut être résolu en donnant un nom à la classe non nommée :

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