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"ここでも、 initializer-listの代わりに the をヒットしたため、最初のFoo. 2 番目の に対してこれを繰り返し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 に答える