共用方式為


編譯程式警告 (層級 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。

關閉警告而不變更程序代碼

您可以使用 pragma ,#pragma warning(suppress : 5208)關閉特定程式代碼warning行的警告。 您也可以使用 warning pragma , #pragma warning(disable : 5208)關閉檔案內的警告。 您可以使用 /wd5208 命令行選項,在命令行組建中全域關閉警告。

若要關閉 Visual Studio IDE 整個專案的警告:

  1. 開啟專案的 [屬性頁] 對話。 如需如何使用 [屬性頁] 對話框的資訊,請參閱屬性頁 (部分機器翻譯)。
  2. 選取 [組態屬性>C/C++][>進階] 頁面。
  3. 編輯 [停用特定警告] 屬性以新增 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;