【问题标题】:Declaring a static private array member声明一个静态私有数组成员
【发布时间】:2015-04-12 19:20:30
【问题描述】:

我的 foo 类需要一个静态 C++ array 作为我最终以这种方式声明的私有成员:

class Foo : public Bar {

private:

    constexpr static array<int, 18> rouges = {1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36};
    // ...
}

但编译器会抛出

error: array must be initialized with a brace-enclosed initializer
error: too many initializers for 'const std::array<int, 18u>'

有趣的是,我的数组大小正好是 18 个元素,如果我声明它array&lt;int, 500&gt;,我仍然会收到too many initializers 错误。至于大括号括起来的初始化程序错误,我不明白编译器期望读取什么。

我通过查看 Stroustrup 的 C++ 之旅 (11.3.1 array) 记录了自己,但我看不出他的做法与我有何不同。或者,删除 constexpr static 关键字并不能消除错误。

感谢您的洞察力。

【问题讨论】:

标签: c++ arrays static mingw


【解决方案1】:

多用一对大括号

constexpr static array<int, 18> rouges = { { 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36 } };
    // ...

实际上有两个聚合,其中一个包含在另一个聚合中。

std;:array 的初始化定义如(23.3.2.1 类模板数组概述)

2 数组是一个聚合(8.5.1),可以用 语法数组 a = { initializer-list };在哪里 initializer-list 是一个逗号分隔的列表,最多包含 N 个元素,其 类型可以转换为 T。

和(8.5.1 聚合)

11 大括号可以在初始化列表中被省略,如下所示。 如果 initializer-list 以左大括号开头,然后是后面的 初始化子句的逗号分隔列表初始化 子聚合;有更多是错误的 初始化子句比成员。

【讨论】:

  • 很好,但是...为什么?!你能详细说明一下吗?我在这里看到的都是一维整数列表。
  • 我很困惑,因为 Stroustrup 的 C++ 之旅 (11.3.1 array) 定义了它:array&lt;int,3&gt; a1 = {1,2,3}。 @DeepBlackDwarf 感谢您的链接。我猜那错误是编译器相关的呢?我的尝试没有收到警告,但确实出现了错误。
  • @PinkTurtle 我认为 C++ 标准相对于这个问题可能更清楚。
  • @PinkTurtle 可能相关:stackoverflow.com/questions/16985687/…
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多