簡體   English   中英

在聚合初始化期間無法訪問繼承的結構成員

[英]Inherited struct members inaccessible during aggregate initialization

struct BasePluginInfo
{
    bool bHasGui, bIsSynth;
    char cType;
    std::string sCategory, sSdkVersion, sVendor, sVersion;
};

struct PluginClassInfo
{
    std::string sName, sUid;
    std::vector<std::string> vsParamNames;
};

struct ShellPluginInfo : BasePluginInfo
{
    std::vector<PluginClassInfo> vciClasses;
};

當我做

ShellPluginInfo
{
    .bHasGui = true
};

編譯器抱怨ShellPluginInfo has no field 'bHasGui'

但是,這有效:

ShellPluginInfo info;
info.bHasGui = true;

所以抱怨我有太多的代碼,所以這些是幾句話來填補它。

當使用基類聚合初始化某些東西時,基 class 就像 class 的成員一樣,類似於您有:

struct ShellPluginInfo {
    BasePluginInfo __base_class_subobject;
    std::vector<PluginClassInfo> vciClasses;
};

因此,初始化列表中的第一個子句將嘗試初始化它,您必須編寫:

ShellPluginInfo{  // This initializer list initializes a ShellPluginInfo
    { .bHasGui = true; }  // This initializer list initializes a BasePluginInfo
}

但是,由於這不是指定的初始值設定項,您不能為派生 class 的成員的 rest 使用指定的初始值設定項。 例如:

ShellPluginInfo{
    {  // (note: doesn't have a designator)
        .bHasGui = true,
        .cType = 'a'  // OK
    },
    .vciClasses = {}  // ERROR: Can't mix designated and non-designated initializers

}

該提案試圖糾正這一點: https://wg21.link/p2287r1 ,使您的原始嘗試有效。 雖然它還沒有被接受,但你可能會在 C++23 中看到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM