c++ - 基于结构中 vector 大小的数组初始化 [c++]

标签 c++ vector initialization

我正在尝试创建一个将区域拆分为子集(此处为 8 个)的程序,每个子集包含 8 个值(对应于预定义的 vector )。 我定义了一个结构来存储这些值(以及 vector ):

struct Storage {
  static const int num_spatial_subset = 8;
  static const std::vector< std::vector<double> > vectors = 
    { {0,0,0}, 
      {0,1,0}, 
      {0,0,1}, 
      {1,1,0}, 
      {1,0,1}, 
      {0,1,1}, 
      {1,0,0}, 
      {1,1,1} };
  double storage[num_spatial_subset][vectors.size()];
};

但是,我在“vector ”初始化时遇到编译错误:

 error: field initializer is not constant
       {1,1,1} };
               ^
 error: in-class initialization of static data member ‘const std::vector<std::vector<double> > Storage::vectors’ of non-literal type
 error: non-constant in-class initialization invalid for static member ‘Storage::vectors’
 error: (an out of class initialization is required)
 error: ‘Storage::vectors’ cannot be initialized by a non-constant expression when being declared
 error: array bound is not an integer constant before ‘]’ token
   double storage[num_spatial_subset][vectors.size()];

vector 对于所有存储对象都是相同的(这就是我将它们定义为静态常量的原因)。

我知道我可以用一个 vector 替换我的存储变量并在 Storage 的构造函数中调整它的大小,但这将涉及将第一个 vector 的大小调整为 8,然后循环将所有内部 vector 的大小也调整为 8。 由于我可能必须创建数千个这样的对象,因此我认为这不是最佳方式。

我真的不明白为什么编译器会提示,因为 vector 是在编译时定义的(以及 vector 的数量)。

谢谢。

最佳答案

vector 上调用size 永远不会返回常量,因为它不符合常量的C++ 规则。编译器不需要知道 size() 做了什么,就其所知,它返回自程序开始执行以来的时间。如果您知道该值是常量,那么您可以定义一个常量来保存该值。但是编译器不需要具备为您执行此操作的知识。

即使编译器以某种方式知道该值是常量,允许您编写这样的代码也会对您造成伤害。如果下一个版本的库或编译器或其他编译器不知道这一点,会发生什么?

关于c++ - 基于结构中 vector 大小的数组初始化 [c++],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37754584/

相关文章:

c++ - 我必须使用 0.f 初始化 float 吗?

c++ - 无法在没有初始化的情况下声明类?

c++ - 获取 std::wstring 的内部指针的地址是否安全?

c++ - 计算机中的文件组织/位置

c++ - C++ 中的多线程抛出线程构造函数失败 : Resource temporarily unavailable

c++ - 如果 arrayposition 是一个整数...?

c++ - 遍历 unordered_set 的效率如何?

R - 通过矢量计数并刷新某个值?

c++ - 为什么 std::vector 没有释放方法?

java - java中的初始化顺序,继承和重写字段