C++未知名称类型

Sah*_*pta 1 c++ function global-variables statements

我有一个头文件定义一些参数.我已经将一些参数定义为extern.我的程序适用于其他数据类型,如double和int,除非我尝试添加矢量变量.头文件中的声明是

extern std::vector<double> my_vec;
Run Code Online (Sandbox Code Playgroud)

在我的主文件中,我使用以下代码构建向量:

std::vector<double> my_vec(3,0);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用clear方法清除向量时,编译器会给出一个错误说明未知类型.我甚至不确定如何调试这个.有人可以帮忙吗?

PS我原本试图使用以下方法为此向量分配一些值:

my_vec[0] = 1;
Run Code Online (Sandbox Code Playgroud)

但是编译器说C++需要所有声明的类型说明符.我用Google搜索了这个错误,但我不明白,因为我指定了my_vec的类型.

编辑:示例:

main.cpp
#include "params.h"
#include <vector>

std::vector<double> my_vec(3,0);

my_vec.clear();
// edit: my_vec[0] = 1; this also produces an error

int main(){
    return 0;
}

params.h
#include <vector>

extern std::vector<double> my_vec;
Run Code Online (Sandbox Code Playgroud)

错误信息:

main.cpp:6:1: error: unknown type name 'my_vec'
my_vec.clear();
^
main.cpp:6:7: error: cannot use dot operator on a type
my_vec.clear();
      ^
2 errors generated.
Run Code Online (Sandbox Code Playgroud)

ein*_*ica 7

你不能在函数之外执行语句 - 这是你正在尝试做的事情my_vec.clear();.无论clear()是向量类的方法 - 调用方法(而不是构造变量)是一个语句,就像x = 1;.那些属于功能.

你必须把你的陈述放在你的某个地方main(),例如:

int main(){
    my_vec.clear();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者首先确保并构建my_vec你想要的样子.

此外,更一般地说,如果你真的不需要它们,你应该避免使用全局变量.并且 - 你很少这样做.看到:

全球变量是否不好?

编辑: OP询问我们是否能以某种方式解决这个限制.首先 - 你真的不应该(看我刚才说的).但它有可能:我们可以使用静态块,它可以在C++中实现.

  • @SahilGupta - 看起来像一个赋值,但实际上是一个伪装成赋值的函数调用.(int x = 42就可以了) (2认同)