C++ 错误:常量的初始值设定项太多

C++ 错误:常量的初始值设定项太多,c++,c++11,C++,C++11,为什么会出现以下错误 $ g++ -std=c++11 aaa.cpp aaa.cpp:15:2:错误:“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;

为什么会出现以下错误

$ g++ -std=c++11 aaa.cpp 
aaa.cpp:15:2:错误:“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;
}
如果我编写代码时没有在类中进行包装,那么它可以很好地编译。给定数组的长度将抑制编译器错误。但是坚持将代码放在类中,避免给出数组大小,因为我以后可能会添加任何成员,我希望将数组长度的确定留给编译器

强烈要求,请避免链接到任何不适当的问题

更新

多亏了胡安科潘扎的评论。现在我知道,即使是这个简单的代码也无法编译:

class aaaa
{
    const int a[]={7,4,5};
};

int main()
{
    return 0;
}

正如您可能理解的,通过将其包装到一个类中,假定的常量不再是引用在初始化常量时给定固定值的对象的名称。相反,您现在声明的是常量数据成员,它与非常量数据成员类似,并且独立存在于该类的每个实例中。您提供的值只不过是初始化构造函数中常量成员的默认值

考虑这个例子:

#include <ostream>
#include <iostream>

struct Demo {
  const int args[3];
  Demo() : args{1,2,3} {}
  Demo(int x) : args{x,x,x} {}
  Demo(int y, int z) : args{y, z} {}
};

int main(void)
{
  Demo d1;
  Demo d2(1,2);
  std::cout << d2.args[0] << ' ' << d2.args[1] << ' '
            << d2.args[2] << '\n';  // outputs "1 2 0"
  return 0;
}
成员
Demo::args
处的初始值设定项不是初始值设定项,而是一个初始值设定项,而构造函数可以指定不同的初始值设定项。这很可能就是不允许进行大小扣减的原因,就像不能对非静态数据成员使用
auto


如果您只是想在程序运行到类提供的名称空间时始终将单个命名实体的名称与常量值放在一起,但不想在某些构造函数中指定不同的值,在类中使用
静态
常量。

C++不允许类型为
t[]
的数据成员。您需要
T[N]
其中
N
是一个常量表达式。你是在问为什么它是不允许的,还是你只是在引用了《标准》中确认它是不允许的之后才这样做?@fredrik对模棱两可感到抱歉。我修复了它。即使删除
const
,它仍然会出错。不,我说“C++不允许t[]类型的数据成员。我猜
a
不是数据成员。在类中,可以有
t={…}
t{…}
,其中
t
是完整类型。
Q[]“C++的标准委员会不……”,我想,它很难用一种有意义的方式来确定整个结构的大小。如果你这样做:“代码>类A{const int b[];},…const int A::{1,1,2,3,4/5}。
如果有固定大小,我相信这是允许的……如果
a::b=…
在另一个文件中呢?
#include <ostream>
#include <iostream>

struct Demo {
  const int args[3] = {1,2,3};
  Demo() {}
  Demo(int x) : args{x,x,x} {}
  Demo(int y, int z) : args{y, z} {}
};

int main(void)
{
  Demo d1;
  Demo d2(1,2);
  std::cout << d2.args[0] << ' ' << d2.args[1] << ' '
            << d2.args[2] << '\n';  // outputs "1 2 0"
  return 0;
}