2017-05-28 35 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 'のどれでもかまいません。静的メンバーは、すべての関数の外部で初期化され、プログラム全体で1回のみ指定されます。 – PaulMcKenzie

+0

@ SuJK基本的には、すべての静的メンバーの定義を提供する必要があります(静的定数を持つものもあります)。その代わりに、 'test :: Stack'という名前の自動変数を' main'関数の中で宣言します。これは明らかにあなたがするべきものではありません。 –

1

あなたは(あなたのケースでは、main)関数の本体内の静的メンバ変数を初期化することはできません

通常、あなたがいずれかの方法の身体の外側に、1つのずつのみの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; 
} 
関連する問題