'No matching constructor for initialization' Rad Studio 10 Clang 编译器
'No matching constructor for initialization' Rad Studio 10 Clang Compiler
我有一段代码,使用 classic BCC 编译器在 C++ Builder XE8 中编译。但是,在使用 Clang 编译器的 Rad Studio 10 Seattle 中,我收到错误
'no matching constructor found for initialization of 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++ 的新手,所以我不确定如何调用上述定义 class/method 的方法。
Clang 编译器不支持这种过时的语言功能吗?有没有办法修改代码或定义以便编译器接受它?
编辑:
我找到了 TChoiceItem
class 的实际声明。
class TChoiceItem : public TChoiceBase
{
public:
char Code;
char *ShortText;
char *Text;
char *Desc;
};
它似乎根本没有任何类型的标准构造函数。但不知何故,一切仍然可以编译并与 classic BCC 编译器一起工作。
编辑 2:
我发现 this question 似乎在描述类似的问题。难道是我在编译代码时需要包含某种编译器标志吗?如果可以,我可以在 embarcadero 项目编译器设置中以某种方式添加一个标志吗?
使用大括号中的值列表来初始化 class 或结构的各个成员称为 aggregate initialization。
如 cppreference.com 中所述,如果 class 具有基数 class(以及其他限制),则不允许聚合初始化。 TChoiceItem
继承自 TChoiceBase
,因此不允许聚合初始化("classic" bcc32 编译器不应该允许它)。
您有两个选择:
首先,您可以将代码更改为不继承自 TChoiceBase
。
其次,你可以定义一个构造函数:
TChoiceItem(char code, char *short_text, char *text, char *desc)
: Code(code), ShortText(short_text), Text(text), Desc(desc) {}
C++11 的 uniform initialization 意味着您的宏的语法不必更改:大括号表示单个成员的值列表,而不是大括号表示构造函数的参数列表, 但结果是一样的。
我有一段代码,使用 classic BCC 编译器在 C++ Builder XE8 中编译。但是,在使用 Clang 编译器的 Rad Studio 10 Seattle 中,我收到错误
'no matching constructor found for initialization of 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++ 的新手,所以我不确定如何调用上述定义 class/method 的方法。
Clang 编译器不支持这种过时的语言功能吗?有没有办法修改代码或定义以便编译器接受它?
编辑:
我找到了 TChoiceItem
class 的实际声明。
class TChoiceItem : public TChoiceBase
{
public:
char Code;
char *ShortText;
char *Text;
char *Desc;
};
它似乎根本没有任何类型的标准构造函数。但不知何故,一切仍然可以编译并与 classic BCC 编译器一起工作。
编辑 2:
我发现 this question 似乎在描述类似的问题。难道是我在编译代码时需要包含某种编译器标志吗?如果可以,我可以在 embarcadero 项目编译器设置中以某种方式添加一个标志吗?
使用大括号中的值列表来初始化 class 或结构的各个成员称为 aggregate initialization。
如 cppreference.com 中所述,如果 class 具有基数 class(以及其他限制),则不允许聚合初始化。 TChoiceItem
继承自 TChoiceBase
,因此不允许聚合初始化("classic" bcc32 编译器不应该允许它)。
您有两个选择:
首先,您可以将代码更改为不继承自 TChoiceBase
。
其次,你可以定义一个构造函数:
TChoiceItem(char code, char *short_text, char *text, char *desc)
: Code(code), ShortText(short_text), Text(text), Desc(desc) {}
C++11 的 uniform initialization 意味着您的宏的语法不必更改:大括号表示单个成员的值列表,而不是大括号表示构造函数的参数列表, 但结果是一样的。