2016-10-18 18 views
2

私は、次のコードを持っている:(。。私は、同様のgccで問題を再現することができますXcodeでLLVMコンパイラを使用しています)テンプレートクラスの静的メンバー変数をクラスの静的メンバー変数として宣言/定義/初期化するにはどうすればよいですか?

template <typename T> 
class A { 
    public: 
     static int a; 
}; 

class B { 
    public: 
     static A<int> a1; 
     static A<double> a2; 
}; 

int B::a1::a = 0; --> It gives an error "a1 is not a class, namespace, enumeration" 

どうやって定義する/静的メンバを初期化/宣言することができますクラスの静的メンバー変数としてのテンプレートクラスの変数?

答えて

4

スタティックメンバーは、そのクラスに基づいて定義されます。 aAの静的メンバーで、とa2が静的​​メンバーの場合は、Bの定義を混在させることはできません。

sepratelyそれらを定義します。

template <typename T> 
int A<T>::a = 0; 

A<int> B::a1; 
A<double> B::a2; 

をあなたはA<T>::aの定義については、テンプレートの特殊化をしたい場合、それは次のようになります。A<double>::a意志のために、そして、A<int>::aの初期値は1になります

template <typename T> 
int A<T>::a = 0; 
template <typename T> 
int A<int>::a = 1; 
template <typename T> 
int A<double>::a = 2; 

2A<char>::aのような他のタイプの場合は0となります。定義がクラスBの定義から依然として独立していることに注意してください。

aB::a1からアクセスする場合は、B::a1.aと書くことができます。 a1A<int>なので、結果はA<int>::aと同じです。

+2

さらに、残りのテンプレート、およびソースファイル内の 'B'の(テンプレート以外の)メンバとともに、テンプレートメンバ' A :: a'をヘッダに定義する必要があります。 –

+0

'A'はA とA のそれぞれの静的メンバー変数ではなく、A? 'A とA だけだと思いますか?) – syko

+0

@sykoはい、 'A 'には静的メンバー 'a'があり、' A 'には独自の静的 'a'があります。これらの場合、上記の定義が使用されます。したがって、 'A 'を使うと 'A :: a'が定義され、' A '、' A :: a'が定義されます... – songyuanyao