2016-10-18 5 views
2

나는 다음과 같은 코드가 있습니다템플릿 클래스의 정적 멤버 변수를 클래스의 정적 멤버 변수로 선언/정의/초기화 할 수 있습니까?

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" 

을 내가 정의/선언 할 수 있습니까 (.. 내가뿐만 아니라 GCC의 문제를 재현 할 수 엑스 코드에서 LLVM 컴파일러를 사용하고 있습니다)/정적 멤버를 초기화를 클래스의 정적 멤버 변수로 템플릿 클래스의 변수?

답변

4

정적 멤버는 클래스에 따라 정의됩니다. aA의 정적 구성원이고 a1a2이 정적 구성원 인 B 인 경우 해당 정의를 혼동 할 수 없습니다.

seprately을 정의 : 당신이 A<T>::a의 정의에 대한 템플릿 특수화를 원하는 경우처럼

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

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

, 그것은 모양 : 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; 

A<double>::a에 대한 것입니다 2 일 경우 A<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 과 A ) – syko

+0

@syko 예, A 에는 정적 멤버 a가 있고 A 에는 자체 정적 인 a가 있습니다. 위의 정의는 이러한 경우에 사용됩니다. 따라서'A '을 사용하면'A :: a'가 정의되고,'A '을 사용하면'A :: a'가 정의됩니다 ... – songyuanyao

관련 문제