1

我正在寻找一个不错的解决方案是如何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

我错过了什么?

谢谢!

4

2 回答 2

4

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

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

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

{{"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"}}}

如预期的。

于 2013-02-04T22:04:40.050 回答
2

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

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

更多,因为我弄清楚为什么。我认为这里的关键是“括号省略”(感谢 jesyspa 指向我那里)

这也有效:

 static boost::array< Foo, 2 > foo =
 {
    "111", "222",
    "333", "444",
 };
于 2013-02-04T19:47:26.257 回答