在结构中声明向量时,C ++不是类型错误

时间:2018-04-03 18:50:09

标签: c++ vector struct stl stdvector

我希望有一个包含向量的节点数据结构。我事先知道了向量的大小,因此我使用SIZE说明符预先初始化const变量。

代码(vectorTest.cpp):

#include <vector>

const int SIZE = 100;

struct node {
  std::vector<int> myVec(SIZE); // ERROR: 'SIZE' is not a type
};

int main(int argc, char const *argv[]) {
  std::vector<int> myVec(SIZE); // VALID
  return 0;
}

COMPILE(g++ 5.4.0):

g++ -std=c++1y vectorTest.cpp -o vectorTest

main()内,一切都很好,我可以高兴地宣布:std::vector<int> A(SIZE);。但是,当我尝试在struct内定义相同内容时,我收到错误消息'SIZE' is not a type

我知道我可以使用C风格的数组定义来声明int s的向量,

struct other_node {
  int myVec[SIZE]; // VALID
};

但我想知道为什么std::vector无法做到这一点。

问题:

  • 这个错误是什么意思?
  • 为什么我不能在struct
  • 中声明预定义大小的矢量

2 个答案:

答案 0 :(得分:5)

  

这个错误是什么意思?

编译器期望行中的函数声明。因此,它期待一种类型而不是一种价值。

  

为什么我不能在struct

中声明预定义大小的矢量

您可以使用:

// Legal but it initializes myVector with one element whose value is SIZE.
// std::vector<int> myVec{SIZE};
std::vector<int> myVec = std::vector<int>(SIZE);

答案 1 :(得分:4)

编译器不希望在类型定义中的那个点进行初始化(它与struct无关,也可能是classunion) 。唯一有效的是成员函数的声明,其结构为<returntype> <name>(<arguments...>)。对于参数,您可以省略名称并仅提供类型。在这种情况下,它是SIZE,但由于这不是一个类型,你会收到错误。

工作方案:

  • 声明构造函数并在那里初始化向量。
  • 使用所需尺寸的矢量初始化:vector<int> myVec = vector<int>(SIZE);

注意:

  • 类似的错误被称为“最令人烦恼的C ++解析”。
  • 始终使用ALL_UPPERCASE并且仅用于宏。这个约定可以帮助你发现它们,这就像是对它们不同行为的警告。