2017-05-28 62 views
0

我想初始化一個類中的矢量Stack,如下所示。 該矢量將僅初始化一次,不會更新。無法在C++中初始化靜態矢量

#ifndef X_HPP 
#define X_HPP 

#include <vector> 

class Test 
{ 
    public: 
     void gen(double x); 
     void PopStack(); 

    private: 
     static std::vector<double> Stack; 
}; 

#endif 

而且CPP文件如下:

#include "X.hpp" 

int main() { 
    std::vector<double> Test::Stack = {1,2,3}; 
    //{1,2,3} is for representation. In the code, it is generated on the fly and is not a constant seq. 
    Test t; 
} 

使用以下命令編譯:

g++ -std=c++11 Y.cpp 

報告的錯誤:

Y.cpp: In function ‘int main()’: 
Y.cpp:4:37: error: qualified-id in declaration before ‘=’ token 
    std::vector<double> Test::Stack = {1,2,3}; 

回答

1

基本上,你應該將該行:

std::vector<double> Test::Stack = {1,2,3}; 

主要功能:

std::vector<double> Test::Stack = {1,2,3}; 

int main() { 
    // ... 
    return 0; 
} 

如果向量動態填充,那麼你可能將它更改爲:

std::vector<double> Test::Stack; 

int main() { 
    // ... 
    return 0; 
} 

,並在運行時填寫堆棧不知何故。

+0

好的,這解決了錯誤。但是,你能詳細說明它爲什麼現在起作用嗎? –

+0

@SuJK自從C++已經存在以來,靜態成員需要被初始化。不管它是'int','double'還是'std :: vector '。靜態成員在所有函數之外初始化,並且在整個程序中只指定一次。 – PaulMcKenzie

+0

@SuJK基本上,你必須爲所有靜態成員提供一個定義(儘管有一些靜態常量)。代替它,你在'main'函數內聲明瞭一個名爲'Test :: Stack'的自動變量,這顯然不是你應該做的事情。 –

1

你不能在函數體內初始化靜態成員變量(main,你的情況)

通常情況下,你把這種代碼在一個又一個唯一的CPP文件,任何方法的體外。 這樣的事情:

std::vector<double> Test::Stack = {1,2,3}; 
int main() { 
    //{1,2,3} is for representation. In the code, it is generated on the fly and is not a constant seq. 
    Test t; 
}