类大括号括起来的初始化列表失败

Posted

技术标签:

【中文标题】类大括号括起来的初始化列表失败【英文标题】:Class brace-enclosed initializer list fails 【发布时间】:2015-02-03 12:16:40 【问题描述】:

我在初始化此类时遇到问题:

class Table
public:
    long r; 
    long c;
    int g;
    int q;
    std::vector<std::vector<long> > data;
//Helper Methods
    Table()r=-1;c=-1;g=-1; q=-1;data.clear();;
    double rate(void) const ...;
    bool check(void) const ...;
    void q_auto(void)q = r / g;;
;

如果我尝试这样做:

static Table my_table = 16200, 10800, 360, 30, 1,3,2,5;

它只是失败了:

error: could not convert ‘16200, 10800, 360, 30, 1, 3, 2, 5’ from ‘<brace-enclosed initializer list>’ to ‘Table’

我确实有 C++11。那么,那里出了什么问题?我尝试使用额外的大括号,但没有运气......我正在使用 g++。

该课程不应该是手写的,但我知道这些值是正确的,并且只想将表格作为全局值粘贴。无需任何额外的内部调用即可获取最终表格值。

【问题讨论】:

【参考方案1】:

结构成员的大括号初始化仅在没有声明用户定义的构造函数时可用。由于Table 有一个用户定义的默认构造函数,因此不允许您直接初始化成员(以防止用户代码在构造函数本身未运行的情况下构造类的实例)。

顺便说一句,函数定义后不需要分号。

编辑:结合 iammilind 的建议,支持将成员默认初始化为 -1 以及大括号初始化的好方法如下:

class Table
public:
    long r = -1; 
    long c = -1;
    int g = -1;
    int q = -1;
    std::vector<std::vector<long> > data;

    double rate(void) const ...
    bool check(void) const ...
    void q_auto(void)q = r / g;
;

这依赖于 C++11 对类成员初始化器的支持,以及 C++14 对带有成员初始化器的类的大括号初始化的支持。

【讨论】:

是的,我只是在写我自己的答案,你只是快了 30 秒:P 我会在 5 分钟内接受它 @DarkZeros,要添加到这个答案,我建议您可以使用 -1 初始化成员变量以具有默认值。 虽然您不需要在函数定义后使用分号,但如上所述,您确实需要在类定义后使用分号。 是的,我知道,我只是复制粘贴而错过了,但我的代码确实有效。谢谢! 使用 NSDMI,您需要 C++14 才能使用聚合初始化。

以上是关于类大括号括起来的初始化列表失败的主要内容,如果未能解决你的问题,请参考以下文章

无法从大括号括起来的初始化列表转换

无法从大括号括起来的初始值设定项列表转换

大括号括起来的初始值设定项列表转换错误

C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组

Python中方括号和括号括起来的列表有啥区别?

列表初始化