web-dev-qa-db-ja.com

std :: pairsのstd :: arrayをどのようにブレース初期化する必要がありますか?

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

VS2013エラー:

エラーC2440:「初期化中」:「int」から「std :: pair」に変換できませんコンストラクターがソース型を取得できないか、コンストラクターのオーバーロード解決があいまいでした `

私は何が間違っているのですか?

22
Neil Kirk

中括弧のペアをもう1つ追加します。

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };

std::array<T, N>は、タイプT[N]のメンバーを含む集約クラスです。通常、プレーンなT[N]配列と同じ方法で初期化できますが、非集計要素タイプを扱う場合は、より明示的にする必要がある場合があります。

25
user743382

std::arrayは集合体です。データメンバーは1つだけです。つまり、指定されたタイプのstd::array特殊化の配列です。 C++標準による。 (8.5.1集計)

2 8.5.4で指定されているように、アグリゲートがイニシャライザリストによって初期化されると、イニシャライザリストの要素は、添え字またはメンバーの昇順で、アグリゲートのメンバーのイニシャライザと見なされます

だからこの記録

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };

std :: arrayにデータメンバーがあるよりも多くの初期化子があります。

std::arrayのデータメンバーは集約されます。イニシャライザリストを用意する必要があります。

したがって、レコードは次のようになります

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };

より明確になるため、次の方法で初期化を想像できます。

std::array<std::pair<int, int>, 2> ids = { /* an initializer for data member of the array */ };

データメンバーは集約されているため、次のように記述する必要があります。

std::array<std::pair<int, int>, 2> ids = { { /* initializers for the aggregate data member*/ } };

そしてついに

std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
18