';没有用于初始化的匹配构造函数';Rad Studio 10铿锵编译器 我有一段代码,它使用经典的BCC编译器在C++ Builder XE8中编译。然而,在Rad Studio 10西雅图使用Clang编译器时,我得到了错误

';没有用于初始化的匹配构造函数';Rad Studio 10铿锵编译器 我有一段代码,它使用经典的BCC编译器在C++ Builder XE8中编译。然而,在Rad Studio 10西雅图使用Clang编译器时,我得到了错误,clang,c++builder,c++builder-xe8,c++builder-10-seattle,Clang,C++builder,C++builder Xe8,C++builder 10 Seattle,“未找到用于TChoiceItem初始化的匹配构造函数” 下面是导致错误的代码片段 LISTITEM_BEGIN( sch_TYPE_Choice ) LISTITEM_DATA( sch_TYPE_Daily, "Daily" ) LISTITEM_DATA( sch_TYPE_Weekly, "Weekly" ) LISTITEM_DATA( sch_TYPE_Monthly, "Monthly" ) LISTITEM_END() 下面是定义

“未找到用于TChoiceItem初始化的匹配构造函数”

下面是导致错误的代码片段

LISTITEM_BEGIN( sch_TYPE_Choice )
    LISTITEM_DATA( sch_TYPE_Daily,      "Daily" )
    LISTITEM_DATA( sch_TYPE_Weekly,     "Weekly" )
    LISTITEM_DATA( sch_TYPE_Monthly,    "Monthly" )
LISTITEM_END()
下面是定义
TChoiceItem

//------------------------------------------------------------------------------
#define LISTITEM_BEGIN( Name ) TChoiceItem Name[] = {
//------------------------------------------------------------------------------
#define INT_LISTITEM_BEGIN( Name ) TIntChoiceItem Name[] = {
//------------------------------------------------------------------------------
#define LISTITEM_DATA( XCode, XText ) { XCode, 0, (char*)XText, 0 },
#define LISTITEM_DATA_NC( XShortText, XText ) { 0, (char*)XShortText, (char*)XText, 0 },
#define LISTITEM_DATA_EX( XCode, XShortText, XText ) { XCode, (char*)XShortText, (char*)XText, 0 },
#define LISTITEM_DATA_EX2( XCode, XShortText, XText, XDesc ) { XCode, (char*)XShortText, (char*)XText, (char*)XDesc },
#define LISTITEM_END() LISTITEM_DATA(0,0) };
<>我对C++是相当新的,所以我不太确定上面定义类/方法的方法。 这是不是某种Clang编译器不支持的过时语言功能?有没有办法修改代码或定义以便编译器接受

编辑:

我找到了
TChoiceItem
类的实际声明

class TChoiceItem : public TChoiceBase
{
    public:
        char  Code;
        char *ShortText;
        char *Text;
        char *Desc;
};
它似乎根本没有任何类型的标准构造函数。但不知何故,所有的东西仍然可以用经典的BCC编译器编译和工作

编辑2:


我发现它似乎描述了一个类似的问题。是否在编译代码时需要包含某种编译器标志?如果是这样,我可以在embarcadero项目编译器设置中添加一个标志吗?

使用大括号中的值列表初始化类或结构的单个成员称为

如cppreference.com上所述,如果类具有基类(以及其他限制),则不允许进行聚合初始化
TChoiceItem
继承自
TChoiceBase
,因此不允许进行聚合初始化(而且“经典”bcc32编译器不应该允许这样做)

您有两个选择:

首先,您可以将代码更改为不从
TChoiceBase
继承

其次,您可以定义构造函数:

TChoiceItem(char code, char *short_text, char *text, char *desc)
    : Code(code), ShortText(short_text), Text(text), Desc(desc) {}

C++11表示宏的语法不必更改:大括号不是表示单个成员的值列表,而是表示构造函数的参数列表,但是结果是一样的。

构造函数有什么
TChoiceItem
呢?我在原始问题中包括了
TChoiceItem
的定义。从定义来看,我根本看不到任何构造函数。
TChoiceBase
的构造函数呢?
TChoiceBase
也没有构造函数。