在聚合初始化期间无法访问继承的结构成员
Inherited struct members inaccessible during aggregate initialization
#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;
}
当用基数 classes 聚合初始化某些东西时,基数 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 的其余成员使用指定构造器。例如:
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 中看到它。
#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;
}
当用基数 classes 聚合初始化某些东西时,基数 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 的其余成员使用指定构造器。例如:
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 中看到它。