【发布时间】:2020-04-28 23:01:25
【问题描述】:
为什么这段代码不能编译?
class MyClass
{
const int size = 5;
int arr[size];
};
错误表明size 是未声明的标识符。
【问题讨论】:
-
更好:
class MyClass { std::array<int, 5> arr; };
标签: c++ arrays class constants
为什么这段代码不能编译?
class MyClass
{
const int size = 5;
int arr[size];
};
错误表明size 是未声明的标识符。
【问题讨论】:
class MyClass { std::array<int, 5> arr; };
标签: c++ arrays class constants
默认成员初始化器(代码中的= 5;)仅指定如何初始化非静态数据成员默认情况下。构造函数可以给它一个不同的值。因此,编译器无法知道它在编译时的值是什么。
因此,您不能在编译时常量表达式中使用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 是非静态的,而您正试图“静态”访问该常量(即没有对象)。
【讨论】:
arr