【问题标题】:Can't create a stack allocated array in a class with a constant variable size无法在具有恒定可变大小的类中创建堆栈分配数组
【发布时间】: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


【解决方案1】:

默认成员初始化器(代码中的= 5;)仅指定如何初始化非静态数据成员默认情况下。构造函数可以给它一个不同的值。因此,编译器无法知道它在编译时的值是什么。

因此,您不能在编译时常量表达式中使用A::size。就像你声明一个数组的大小一样。

如果您打算让每个Asize 为5,那么变量应该是constexpr static 成员。或者按照评论中的建议,std::array<..., 5>

【讨论】:

    【解决方案2】:

    当你声明一个数组时,你需要一个大小的常量表达式。

    设置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;
    };
    

    【讨论】:

      【解决方案3】:

      这是因为size 是非静态的,而您正试图“静态”访问该常量(即没有对象)。

      【讨论】:

      • 静态访问常量是什么意思?
      • 这意味着您正在尝试访问没有该类的对象实例的成员。
      • 没有对象实例也就没有arr
      猜你喜欢
      • 2021-03-14
      • 2019-01-16
      • 2021-10-21
      • 2015-05-05
      • 1970-01-01
      • 2014-05-17
      • 2011-12-05
      • 1970-01-01
      • 2011-12-10
      相关资源
      最近更新 更多