【问题标题】:Compiler does not recognize member initializer for std::vector编译器无法识别 std::vector 的成员初始值设定项
【发布时间】:2021-01-21 02:51:10
【问题描述】:

我想将 std::vector 初始化为具有特定长度。 在我使用的 .hpp 文件中

#include <vector>

class foo
{
foo(){};
~foo(){};
std::vector<double> pressure (4,0); //vector 4 elements = 0

void readPressure()
{
    pressure.at(0) = 1;
    pressure.at(1) = 2;
    pressure.at(2) = 3;
    pressure.at(3) = 4;
}
...
};

但我得到了错误:

error: expected identifier before numeric constant
std::vector<double> pressure(4,0);
                             ^
error: expected ',' or '...' before numeric constant

我读到这可能是由于没有使用 C++11,但我在我的 makefile 中指定了

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

我在树莓派 4 上编译,g++ 版本是 8.3

***编辑了 .hpp 文件

【问题讨论】:

  • 你为什么要把它放在一个 .hpp 文件中?这应该在一些 .cpp 文件中。还可以尝试以下声明: auto pressure = std::vector(4, 0);避免最麻烦的解析。
  • 尝试以详细模式运行 cmake --build build 以绝对确定您的标志 (VERBOSE=1 cmake --build build),因为这些代码在我身上编译 reproductible。这也不是一个初始化列表,它将 4 个零放入向量,而不是值 4,然后是零
  • 我怀疑它实际上是一个类的成员,而您认为这个细节无关紧要。请阅读minimal reproducible example
  • 您发布的内容compiles。因此,这不是问题所在,或者您发布的内容不是您实际在做的事情。如果您希望我们帮助解决问题,发布一个正确的minimal reproducible example,它实际上重现问题为我们使用您发布的内容是至关重要的。不相关,“在我使用的 .hpp 文件中...” 全局声明不属于头文件,至少不是那样。所以这强烈支持@molbdnilo 水晶球,它被埋在一些你完全忽略的类/模板声明中......
  • 我撤回了我的评论,因为您的代码似乎有效。现在我们可以看到真实的代码了,我想再次添加它,因为问题确实是Most vexing parsing。我很确定这有重复,但是 TL;DR;您需要在构造函数中对其进行初始化,最好在成员初始化列表中进行。

标签: c++ c++11 gcc cmake


【解决方案1】:

Default member initializer (C++11 起) 仅支持大括号和等号初始化器。例如

class foo
{
    std::vector<double> pressure = std::vector<double>(4,0); //vector 4 elements = 0
    ...
};

顺便说一句:我们不能将大括号初始化器用作std::vector&lt;double&gt; pressure{4,0};,因为它会初始化包含两个元素的vector,其值为40,这不是您想要的。

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2014-08-17
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多