【发布时间】:2015-01-24 08:53:25
【问题描述】:
为什么会出现以下错误
$ g++ -std=c++11 aaa.cpp
aaa.cpp:15:2: error: too many initializers for ‘const aaaa::Fruit_List [0]’
};
^
编译以下代码时:
class aaaa
{ // without wrapping in class the code compiles fine
const int a=7; // compiles fine
struct Fruit_List{
int index;
int length;
} const fruit_list[]={ // error: if I put 5 in braket the code compiles fine
{0,3},
{1,2},
{2,5},
{3,1},
{4,7}
};
};
int main()
{
return 0;
}
如果我编写代码而不包含在类中,它会编译得很好。给出数组的长度将抑制编译器错误。但坚持将代码放在类中并避免给出数组大小,因为我以后可能会添加任何成员,并且我想将数组长度确定留给编译器。
强烈,请避免链接到任何不适当的问题。
更新
感谢 juanchopanza 的评论。现在我知道即使是这个更简单的代码也无法编译:
class aaaa
{
const int a[]={7,4,5};
};
int main()
{
return 0;
}
【问题讨论】:
-
C++ 不允许
T[]类型的数据成员。您需要T[N],其中N是一个常量表达式。您是在问为什么不允许这样做,还是只是在引用标准后确认不允许这样做? -
@fredrik 对歧义感到抱歉。我修好了。
-
即使你删除
const,它仍然会报错。 -
不,我说“C++ 不允许 T[] 类型的 数据成员。我猜
a不是数据成员。在一个类中,你可以有T = {....}或T{.....}其中T是一个完整的类型。Q[]不满足。 -
这个问题你必须问 C++ 标准委员会... ;) 我的猜测是它很难以有意义的方式确定整个结构的大小。如果你这样做怎么办:
class a { const int b[]; }; ... const int a::b = { 1,2,3,4,5 };如果有固定大小,我认为这是允许的......如果a::b = ..在另一个文件中怎么办?