【问题标题】:HowTo init boost::array with custom structure?如何使用自定义结构初始化 boost::array?
【发布时间】:2013-02-04 10:25:27
【问题描述】:

我正在寻找一个不错的解决方案,即如何使用自定义用户结构和数据初始化静态 boost::array。我的例子,我对boost::array 的期望,如下:

 struct Foo
 {
      std::string a;
      std::string b;
 };
 static boost::array< Foo, 2 > foo =
 {
      { "111", "222" },
      { "333", "444" },
 };

但是这段代码不起作用,

error C2078: too many initializers

我错过了什么?

谢谢!

【问题讨论】:

  • 这也适用于 std::array。我在此处留下此评论,希望搜索引擎在搜索 std::array 问题时能更高地显示此问题。

标签: c++ boost c++11 struct aggregate-initialization


【解决方案1】:

这是由大括号省略的工作方式引起的。从 N3485,8.5.1.11:

可以在 initializer-list 中省略大括号,如下所示。如果 initializer-list 以左大括号开头,则 initializer-clauses 的后续逗号分隔列表初始化子聚合的成员; initializer-clauses 比成员多是错误的。但是,如果子聚合的 initializer-list 不以左大括号开头,则仅从列表中获取足够的 initializer-clauses 来初始化子聚合;剩下的任何 initializer-clauses 都被留下来初始化当前子聚合所属的聚合的下一个成员。

换句话说,如果接下来是一个初始化列表,我们可以假设没有发生大括号省略。大括号插入在最内层,所以虽然我们想要以下内容

{{"a", "b"}, {"c", "d"}}  -> {{{"a", "b"}, {"c", "d"}}}

我们反而得到

{{"a", "b"}, {"c", "d"}} -> {{{"a", "b"}}, {"c", "d"}}

现在关于为什么我们可以省略更多大括号并写入{"a", "b", "c", "d"}:一旦我们点击"a",我们就知道大括号省略已经发生,因为我们希望数组成员使用初始化列表进行初始化。因此,我们开始使用尽可能多的初始化子句来初始化成员数组。同样,我们点击"a" 而不是初始化列表,因此我们开始使用尽可能多的初始化子句来初始化第一个Foo。我们对第二个 Foo 重复此操作,使用所有子句,并以

结尾
{"a", "b", "c", "d"} -> {{{"a", "b"}, {"c", "d"}}}

根据需要。

【讨论】:

    【解决方案2】:

    添加一组额外的大括号对我有用。

     static boost::array< Foo, 2 > foo =
     {{
        { "111", "222" },
        { "333", "444" },
     }};
    

    更多,因为我找出原因。我认为这里的关键是“括号省略”(感谢 jesyspa 指点我)

    这也有效:

     static boost::array< Foo, 2 > foo =
     {
        "111", "222",
        "333", "444",
     };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2013-10-25
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多