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

Posted

技术标签:

【中文标题】无法从大括号括起来的初始值设定项列表转换【英文标题】:Could not convert from brace-enclosed initializer list 【发布时间】:2018-03-04 00:04:47 【问题描述】:

我正在尝试编译下面的代码,但我一直遇到错误 could not convert '1, 2, 5, 6' from '<brace-enclosed initializer list>' to 'Class1'。我正在编译-std=c++11 中的代码。我的初始化错了吗?

class Class1

public:
    vector<vector<int> > a;
    Class1(vector<vector<int> > p)
    

        for(int i = 0; i < 2; i++)
            for(int j = 0; j < 2; j++)
                a[i][j] = p[i][j];
    
;

int main()

    Class1 ClassValue =    1, 2, , 5, 6  ;
    return 0;

【问题讨论】:

Add another set of braces。您大致调用Class1(1, 2, 5, 6),这是一个只需要1个函数的2个参数。 而你的构造函数是没用的,是默认的....其实你的构造函数是错的,a没有调整大小。 OT:请注意,这些循环对于复制向量是不必要的。您所要做的就是写a = p。它也可以在成员初始化列表 (Class1(...) : ap ) 中完成。你也复制了两次而不是一次,所以你应该写Class1(...) : astd::move(p 循环开始不好,即使它有效。您不应该使用像2 这样的幻数,甚至不应该使用变量来确定条目数。 vector 有一个 size() 成员函数 -- 使用它来确定条目数,而不是幻数。 【参考方案1】:

首先,将你的行改为:

Class1 ClassValue ( 1, 2 , 5, 6  );

第二件事是您的构造函数无效,因为您写入不存在的内存。相反,使用:

Class1(vector<vector<int> > p):a(p)

评论后编辑:这个会更好(更快),因为您不会第二次复制。

Class1(vector<vector<int> > p):a(move(p))

【讨论】:

astd::move(p),因为你要复制两次,否则。

以上是关于无法从大括号括起来的初始值设定项列表转换的主要内容,如果未能解决你的问题,请参考以下文章

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

大括号初始值设定项列表中是不是允许显式转换运算符?

从朋友类继承时无法使用大括号括起来的初始化列表

为啥在使用大括号初始值设定项列表时首选 std::initializer_list 构造函数?

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

C++ 不能用初始值设定项列表初始化非聚合错误