首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“未匹配初始化构造函数”Rad Studio 10 Clang编译器

“未匹配初始化构造函数”Rad Studio 10 Clang编译器
EN

Stack Overflow用户
提问于 2015-09-03 13:22:49
回答 1查看 829关注 0票数 3

我有一个代码片段,它使用经典的BCC编译器在C++ Builder XE8中编译。但是,在使用Clang编译器的Rad 10西雅图中,我得到了错误

'no matching constructor found for initialization of TChoiceItem'

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

代码语言:javascript
运行
复制
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的代码

代码语言:javascript
运行
复制
//------------------------------------------------------------------------------
#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类的实际声明。

代码语言:javascript
运行
复制
class TChoiceItem : public TChoiceBase
{
    public:
        char  Code;
        char *ShortText;
        char *Text;
        char *Desc;
};

它似乎根本没有任何标准的构造函数。但是不知怎么的,所有的东西仍然在编译和使用经典的BCC编译器。

编辑2:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 17:37:46

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

正如在cppreference.com上解释的那样,如果类有一个基类(以及其他限制),则不允许聚合初始化。TChoiceItem继承自TChoiceBase,因此不允许聚合初始化(而“经典”bcc32编译器不应该允许它)。

你有几个选择:

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

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

代码语言:javascript
运行
复制
TChoiceItem(char code, char *short_text, char *text, char *desc)
    : Code(code), ShortText(short_text), Text(text), Desc(desc) {}

C++11的均匀初始化意味着宏的语法不必改变:大括号不是单个成员的值列表,大括号意味着构造函数的参数列表,但结果是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32376898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档