以下是我遇到问题的代码:
class Foo {
public:
Foo() :
memberArray{Bar(1), Bar(3), Bar(2)}
{}
struct Bar {
Bar(int param1) { }
};
private:
std::array<Bar,3> memberArray;
// Bar memberArray[3]; // Using a raw array like this instead compiles fine..
};
我正在使用GCC 4.6.1,并为c ++ 11编译。我应该如何初始化我的std :: array?
答案 0 :(得分:5)
由于array<T, N>
实际上是一个结构,因此完全支撑的版本需要{{ .. }}
(内部版本用于array<T, N>
对象的数组成员)。该规范不允许在此处使用大括号。它只允许声明
Type var = { ... };
所以你必须使用完全支撑的语法
Foo() :
memberArray{{Bar(1), Bar(3), Bar(2)}}
{}
这不是GCC错误,但是规范要求。
答案 1 :(得分:2)
作为一种变通方法,您可以让函数返回此数组的实例。
#include <array>
class Foo {
public:
Foo() :
memberArray(makeMemberArray())
{}
struct Bar {
Bar(int param1) { }
};
private:
std::array<Bar,3> memberArray;
// Bar memberArray[3]; // Using a raw array like this instead compiles fine..
static std::array<Bar, 3> makeMemberArray() {
std::array<Bar,3> a = {Bar(1), Bar(2), Bar(3)};
return a;
}
};
我认为统一初始化应该允许你正在做的事情,除非它可能没有被编译器实现。
答案 2 :(得分:0)
以Johannes Schaub为基础 - litb的回答......至少GCC会允许你使用缩写语法(省略,无意义的类名):
Foo() :
memberArray{{ {1}, {3}, {2} }}
{}
而不是
Foo() :
memberArray{{Bar(1), Bar(3), Bar(2)}}
{}
我个人在初始化多态指针数组时只使用第二个版本:
Foo() :
memberArray{{
dynamic_cast<Bar*>(new BarA(1)),
dynamic_cast<Bar*>(new BarB(3)),
dynamic_cast<Bar*>(new BarC(2))
}}
{}
答案 3 :(得分:-5)
试试这个(适用于g ++ 4.5.2):
Foo() :
memberArray (std::array<Bar,3> {Bar(1), Bar(3), Bar(2)})
{}