【问题标题】:在聚合初始化期间无法访问继承的结构成员
【发布时间】:2022-01-21 10:10:19
【问题描述】:
#include <vector>
#include <string>

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;
};

当我这样做时

int main() {
    ShellPluginInfo
    {
        .bHasGui = true
    };
}

编译器抱怨ShellPluginInfo has no field 'bHasGui'

但这是可行的:

int main() {
    ShellPluginInfo info;
    info.bHasGui = true;
}

【问题讨论】:

    标签: c++ inheritance struct aggregate-initialization


    【解决方案1】:

    当用基类聚合初始化某些东西时,基类就像类的成员一样,类似于你有:

    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
    }
    

    但是,由于这不是指定的初始值设定项,因此您不能对派生类的其余成员使用指定的初始值设定项。例如:

    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 中看到它。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多