std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
VS2013エラー:
エラーC2440:「初期化中」:「int」から「std :: pair」に変換できませんコンストラクターがソース型を取得できないか、コンストラクターのオーバーロード解決があいまいでした `
私は何が間違っているのですか?
中括弧のペアをもう1つ追加します。
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
std::array<T, N>
は、タイプT[N]
のメンバーを含む集約クラスです。通常、プレーンなT[N]
配列と同じ方法で初期化できますが、非集計要素タイプを扱う場合は、より明示的にする必要がある場合があります。
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 } } };