#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;
}
uj5u.com熱心網友回復:
當使用基類聚合初始化某些東西時,基類的行為就像類的成員,類似于:
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 中看到它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386955.html
上一篇:覆寫方法陰影多載最終版本
下一篇:使用模板繼承鉆石時會出錯嗎?
