为什么此代码无法编译?
class MyClass
{
const int size = 5;
int arr[size];
};
错误表明size
是未声明的标识符。
默认成员初始化器(代码中的= 5;
)仅指定如何初始化非静态数据成员默认。构造函数could为其赋予不同的值。因此,编译器不能知道在编译时其值是什么。
因此,不能在编译时常量表达式中使用A::size
。就像您声明数组的大小一样。
如果您希望每个A
的size
为5,则该变量应为constexpr static
成员。或在注释中建议为std::array<..., 5>
。
声明数组时,您需要一个常量表达式来表示大小。
设置大小static
将解决您的问题
class MyClass
{
const static int size = 5;
int arr[size];
};
通常,由于大小是固定的,因此您更希望使用std::array
。您可以选择将大小作为模板参数。
template <std::size_t N>
class MyClass
{
std::array<int, N> arr;
};
这是因为size
是非静态的,并且您试图“静态地”访问该常量(即没有对象)。