【问题标题】: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(...) : a{p} {}) 中完成。你也复制了两次而不是一次,所以你应该写Class1(...) : a{std::move(p} {}
  • 循环开始不好,即使它有效。您不应该使用像2 这样的幻数,甚至不应该使用变量来确定条目数。 vector 有一个 size() 成员函数 -- 使用它来确定条目数,而不是幻数。

标签: c++ initialization


【解决方案1】:

首先,将你的行改为:

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

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

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

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

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

【讨论】:

  • a{std::move(p)},因为你要复制两次,否则。
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
相关资源
最近更新 更多