有没有理由为什么代码块告诉我我不能制作一个数组?我只是想做:
const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
它正在给我
错误:在'{'标记
之前,不允许使用括号括起的初始值设定项
我已经更改了初始化程序的其他部分,但错误总是说同样的事情。这似乎没有意义,因为这是我在c ++中学到的第一件事。
答案 0 :(得分:57)
你说你是在一个班级内做的,作为私人变量。
回想一下(目前),成员变量可能不会在您声明它们的同一个地方初始化(除了少数例外)。
struct T {
std::string str = "lol";
};
不行。它必须是:
struct T {
std::string str;
T() : str("lol") {}
};
但是,为了增加对伤害的侮辱,在C ++ 0x之前你不能初始化ctor-initializer
中的数组!:
struct T {
const unsigned int array[10];
T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :(
};
而且,因为你的数组的元素是const
,所以你不能依赖于赋值:
struct T {
const unsigned int array[10];
T() {
for (int i = 0; i < 10; i++)
array[i] = i; // not possible :(
}
};
然而,正如其他一些贡献者已经非常正确地指出的那样,如果你不能修改它的元素,那么为每个T
实例提供一个数组副本似乎没什么意义。相反,您可以使用static
成员。
因此,以下内容最终将以最佳方式解决您的问题:
struct T {
static const unsigned int array[10];
};
const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9};
希望这有帮助。
答案 1 :(得分:7)
由于这是类中的私有成员变量(根据注释),因此在C ++ 03中确实不允许这样做。
C ++ 0x,部分由许多现代编译器支持,允许以下编译:
class C
{
const unsigned int ARRAY[10];
public:
C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {}
};
int main()
{
C obj; // contains a non-static const member: non-assignable
}
但是,非静态const成员只有在类的不同实例中包含不同的值时才有意义。如果每个实例都包含相同的{0,1,2,3,4,5,6,7,8,9}
,那么你应该使它static
,这也可以在C ++ 98中执行此操作:
class C
{
static const unsigned int ARRAY[10];
public:
C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};
int main()
{
C obj;
}