std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
VS2013 错误:
错误 C2440:“正在初始化”:无法从“int”转换为“std::pair”没有构造函数可以采用源类型,或者构造函数重载决议不明确`
我究竟做错了什么?
std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
VS2013 错误:
错误 C2440:“正在初始化”:无法从“int”转换为“std::pair”没有构造函数可以采用源类型,或者构造函数重载决议不明确`
我究竟做错了什么?
添加另一对牙套。
std::array<std::pair<int, int>, 2> ids = { { { 0, 1 }, { 1, 2 } } };
std::array<T, N>
是一个包含类型成员的聚合类T[N]
。通常,您可以以与普通T[N]
数组相同的方式进行初始化,但是当您处理非聚合元素类型时,您可能需要更加明确。
std::array
是一个聚合体。它只有一个数据成员 - 指定类型的特化数组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 } } };