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

VS2013 エラー:

error C2440: 'initializing' : 'int' から 'std::pair' に変換できません コンストラクターがソース型を取得できないか、コンストラクターのオーバーロードの解決があいまいです '

私は何を間違っていますか?

4

2 に答える 2

34

もう 1 組の中括弧を追加します。

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

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

于 2014-12-27T16:45:20.047 に答える
24

std::array集合体です。std::arrayデータ メンバーは 1 つだけです。特殊化の指定された型の配列です。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 } } };
于 2014-12-27T17:02:36.867 に答える