【问题标题】:How do you initialize (through initializer lists) a multidimensional std::array in C++11?如何在 C++11 中初始化(通过初始化列表)多维 std::array?
【发布时间】:2012-02-29 17:50:17
【问题描述】:

我正在尝试通过初始化程序列表初始化 2D std::array,但是编译器告诉我初始化程序太多。

例如:

std::array<std::array<int, 2>, 2> shape = { {1, 1},
                                            {1, 1} };

编译器错误:错误:‘std::array&lt;std::array&lt;int, 2ul&gt;, 2ul&gt;’ 的初始化程序太多

但显然没有太多。我是不是做错了什么?

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    尝试再添加一对 {} 以确保我们正在初始化内部 C 数组。

    std::array<std::array<int, 2>, 2> shape = {{ {1, 1},
                                                 {1, 1} }};
    

    或者直接去掉所有的括号。

    std::array<std::array<int, 2>, 2> shape = { 1, 1,
                                                1, 1 };
    

    【讨论】:

    • 对我来说,我们必须这样做总是感觉像是抽象泄漏。我想这只是库不是语言“内部”的结果,而是用 它构建的。
    • 刚试过这个,如果你不想警告,std::array&lt;std::array&lt;int, 2&gt;, 2&gt; shape = {{ {{1, 1}}, {{1, 1}} }};。哇
    【解决方案2】:

    我会建议(甚至没有尝试过,所以我可能是错的)

    typedef std::array<int, 2> row;
    std::array<row,2> shape = { row {1,1}, row {1,1} };
    

    【讨论】:

    • 它可以工作,但是我想知道为什么我的版本没有。乍一看,这两种表达方式似乎相同。
    • @zoopp:不,他们没有。 Basile 使用显式构造,而您没有。
    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 2018-04-20
    • 2017-10-27
    • 2016-02-08
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多