2013-03-05 8 views
15

私はC++で静的なマップを初期化する方法を検索し、このコードを発見された:静的データメンバを(宣言とは反対に)定義するときに "'static'を使用できないのはなぜですか?

struct A{ 
static map<int,int> create_map() 
    { 
     map<int,int> m; 
     m[1] = 2; 
     m[3] = 4; 
     m[5] = 6; 
     return m; 
    } 
static const map<int,int> myMap; 

}; 

const map<int,int> A:: myMap = A::create_map(); 

しかし、私は

const static map<int,int> A:: myMap = A::create_map(); 

コンパイラの苦情への最後の行を変更した場合:ではないかもしれない「静的」

答えて

15
?この背後にあるロジックや推論何なぜ?「(宣言ではなく)

を静的データメンバを定義するときに使用し、私は疑問に思います

staticは、変数定義で使用すると(C言語では)意味を持ちます。 C++を学ぶCプログラマーにとって、意味は時々変わってきたが、必ずしもそうではないことに気づくのは非常に驚くべきことです。

新しい意味(静的メンバーシップ)はクラス定義内でのみ有効です(Cではstaticキーワードが許可されていません)。

3

これは、他のすべては、この最小限の、概念的に同じで、一例で投げちょうどより多くのキーワードである

struct A 
{ 
    static int x; 
} 

int A::x;   //legal 
static int A::x; //illegal 

よりも、何ら変わりません。 staticメンバーは、クラス定義内で staticとしか宣言できません。クラス外部

const map<int,int> A:: myMap = A::create_map(); 

static部材A::myMapのちょうど定義です。余分なstaticは意味をなさない。

これはおそらく混乱を避けるための理由です。staticフリー変数は、(翻訳単位の)「プライベート」変数のようなものです。メンバstaticは反対です。

2

クラスメンバを宣言するstaticは、このクラスのすべてのオブジェクト間で共有されていることを意味します。

staticをクラス外の変数定義に追加すると、この変数はファイルスコープを持ち、このファイルの外側には表示されません。

それは、これが意味するであろう

const static map<int,int> A:: myMap = A::create_map(); 

に許される場合は、このファイルの外に表示されていない静的メンバ変数を、持っています。これは意味をなさない。

+0

それ以外の場合は、静的メンバーシップが矛盾することになります。 –

+0

@BenVoigt、メンバーシップの静的な可能性はありません。冗長性があります。このように非静的メンバーを定義することはできません。 – Slava

+0

@Slava:まあまあ、それは矛盾して冗長なので、それを禁止する2つの理由があります。しかし私は静的なリンケージを考えているとは思わない。 –

関連する問題