类大括号括起来的初始值设定项列表失败

Class brace-enclosed initializer list fails

本文关键字:列表 失败 起来      更新时间:2023-10-16

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

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++。

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

结构成员的大括号初始化仅在未声明用户定义的构造函数时可用。由于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 支持。