我有一小段使用经典BCC编译器在C ++ Builder XE8中编译的代码。但是,在Rad Studio 10 Seattle中使用Clang编译器,我得到了错误
'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 ++相当陌生,因此我不确定要如何调用上述定义类/方法的方法。
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的统一初始化意味着不必更改宏的语法:大括号表示对构造函数的参数列表,而不是大括号表示单个成员的值列表,但结果将相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句