17

私はC++で静的マップを初期化する方法を探していて、次のコードを見つけました:

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();

コンパイラの苦情:静的データメンバーを(宣言するのではなく)定義するときに「静的」を使用できない場合があります」?

なんでだろう?この背後にある論理または理由は何ですか?

4

3 に答える 3

16
static int    a = 0; // grandfathered and still useful, provides static *LINKAGE*
                     // and static STORAGE DURATION
static int X::a = 0; // confusing and illegal, is it static LINKAGE
                     // or static STORAGE DURATION
                     // or static MEMBERSHIP?

static変数定義で使用された場合、すでに(Cで)意味がありました。C ++を学習しているCプログラマーにとって、意味が時々変更されていることに気付くのは非常に驚くべきことですが、常にではありません。

staticしたがって、新しい意味(静的メンバーシップ)は、クラス定義内でのみアクティブになります(Cがキーワードを許可しなかった場合)。

于 2013-03-05T22:16:21.847 に答える
4

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

staticクラスの外部で変数定義に追加すると、この変数にはファイルスコープがあり、このファイルの外部には表示されないことを意味します。

それが許可される場合

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

これは、このファイルの外部には表示されない静的メンバー変数があることを意味します。これは意味がありません。

于 2013-03-05T22:19:54.010 に答える
4

それは違いはありません

struct A
{
   static int x;
}

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

他のすべては、この最小限の、概念的に同一の例でスローされるより多くのキーワードです。メンバーは、クラス定義内でstaticのみ宣言できます。static

The

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

クラスの外には、staticメンバーの定義がありA::myMapます。余分なstaticものはそこには意味がありません。

この背後にある理由は、おそらく混乱を避けるためです。static自由変数は一種の「プライベート」変数です(変換ユニットにとって)。メンバーstaticは反対です。

于 2013-03-05T22:16:29.327 に答える