'没有用于初始化的匹配构造函数' Rad Studio 10 Clang编译器

时间:2015-09-03 13:22:49

标签: clang c++builder c++builder-xe8 c++builder-10-seattle

我有一段代码,使用经典的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 ++很新,所以我不确定如何调用上面定义类/方法的方法。

Clang编译器是否支持某种过时的语言功能?有没有办法修改代码或定义,以便编译器接受它?

编辑:

我找到了TChoiceItem类的实际声明。

class TChoiceItem : public TChoiceBase
{
    public:
        char  Code;
        char *ShortText;
        char *Text;
        char *Desc;
};

它似乎根本没有任何标准构造函数。但不知何故,一切仍然可以编译并与经典的BCC编译器一起使用。

编辑2:

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

1 个答案:

答案 0 :(得分:2)

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

如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的uniform initialization意味着您的宏语法不必更改:而不是大括号意味着单个成员的值列表,大括号将表示构造函数的参数列表,但是结果将是相同的。