我有以下代码。基本上我想使用聚合初始化语法初始化非POD结构的std ::数组。 g ++ 4.6和4.7(最新的每周快照)都无法编译代码。
#include <array>
struct TheClass {
int a1, a2;
TheClass(int b1, int b2) : a1{b1}, a2{b2} {};
};
template<unsigned D>
struct OtherClass {
std::array<TheClass, D> a;
OtherClass(std::array<TheClass, 2> b) : a{b} {};
};
int main()
{
OtherClass<2>{{ {1, 2}, {2, 3} }}; //tried a lot of options here
}
GCC错误:
v.cpp: In function ‘int main()’:
v.cpp:20:37: error: no matching function for call to ‘OtherClass<2u>::OtherClass(<brace-enclosed initializer list>)’
v.cpp:20:37: note: candidates are:
v.cpp:15:5: note: OtherClass<D>::OtherClass(std::array<TheClass, 2ul>) [with unsigned int D = 2u]
v.cpp:15:5: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::array<TheClass, 2ul>’
v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(const OtherClass<2u>&)
v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const OtherClass<2u>&’
v.cpp:11:8: note: constexpr OtherClass<2u>::OtherClass(OtherClass<2u>&&)
v.cpp:11:8: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘OtherClass<2u>&&’
我的问题:上面的代码是否正确?似乎std :: array是一个聚合,构造其数据成员应该没有问题。也许这是海湾合作委员会的一个错误?
修改
OtherClass<2>{{ TheClass{1, 2}, TheClass{2, 3} }};
当然有效,但我不想使用它,因为我必须在很多地方构建类。 C ++ 11应该支持省略TheClass
。另请参阅this question。
答案 0 :(得分:2)
std::array
是一个包含数组的聚合,所以你需要一对额外的大括号来从常规数组中初始化它:
{1,2} // TheClass
{{1,2},{2,3}} // TheClass[2]
{{{1,2},{2,3}}} // std::array<TheClass,2>
{{{{1,2},{2,3}}}} // OtherClass<2>
然而,似乎旧版本的GCC仍然与此相关:4.5.1 rejects it,而4.6.1接受它。