我正在尝试创建一个将区域拆分为子集(此处为 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/