コンパイラの警告 (レベル 1) C5208 とエラー C7626
typedef 名で使用されている名前のないクラスでは、静的でないデータ メンバー、メンバーの列挙値、メンバー クラス以外のメンバーを宣言できません
解説
typedef
宣言内の名前のないクラスは、それ以外のメンバーを持つことができません:
- 既定のメンバー初期化子を持たない非静的データ メンバー、
- メンバー クラス、または
- メンバー列挙型。
入れ子になった各クラスに対しても、同じ制限が再帰的に適用されます。 この制限は、リンケージのために typedef
名を持つ構造体の単純さを確保することを目的としています。 それらは、コンパイラがリンケージの typedef
名に達する前にリンケージ計算が必要となることがないように、単純である必要があります。
この警告は Visual Studio 2019 バージョン 16.6 で新たに追加されたものです。 C++ 標準化委員会によって欠陥レポートとして採用された P1766R1 に基づいて、コンパイラのすべての標準モードに影響します。 既定の /std:c++14
と /std:c++17
モードでは、コンパイラは適合しないコードに対して警告 C5208 を発します。 /permissive-
が指定された場合、コンパイラは /std:c++14
のエラーとして警告 C5208 を出します。 /std:c++17
以降が指定されている場合、コンパイラは適合しないコードに対してエラー C7626 を出します。
コードを変更せずに警告をオフにするには
warning
pragma、#pragma warning(suppress : 5208)
を使うことで、特定のコード行に対する警告をオフにできます。 また、警告の pragma である #pragma warning(disable : 5208)
を使用することで、ファイル内の警告をオフにできます。 コマンドライン ビルドでは、/wd5208 コマンド ライン オプションを使用して警告をグローバルにオフにできます。
Visual Studio IDE でプロジェクト全体の警告をオフにするには、次のようにします:
- プロジェクトの [プロパティ ページ] ダイアログを開きます。 [プロパティ ページ] ダイアログの使用方法の詳細については、プロパティ ページを参照してください。
- [構成プロパティ] > [C/C++] > [詳細] ページを選択します。
- [特定の警告を無効にする] プロパティを編集して
5208
を追加します。 [OK] をクリックして変更を適用します。
例
次の例は、名前のない構造体では使用できなくなったコンストラクトを示しています。 指定された標準モードに応じて、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;