2013-10-09 2 views
6

내가 클래스 다음 과제에서 지금다른 인스턴스화를 가진 정적 템플릿 클래스 변수가 동일합니까?

template <typename T> 
class MyClass 
{ 
    static int myvar; 
} 

어떤 일이 일어날 것 말해봐?

MyClass<int>::myvar = 5; 
MyClass<double>::myvar = 6; 

표준에 따라 어떻게됩니까? MyClass :: myvar 또는 두 버전을 사용할 예정입니까?

+3

간단한 대답, 두 – john

+1

@ShafikYaghmour 거대한 클래스 집합에 대한 설명서를 쓰고 있는데 정적 변수를 설정하는 정적 함수가 있기 때문에이 질문이 나에게 발생했습니다. 대중을위한 질문. 아마 표준이 그것에 대해 말하는 것을 아는 것은 노력하는 것보다 낫습니다. –

+1

@TheQuantumPhysicist 알겠습니다. 각 전문 분야에 정적 멤버의 복사본이 있다는 표준의 인용문을 발견했습니다. –

답변

2

OP가 구체적으로 표준의 견적을 요청 했으므로 표준의 관련 견적을 포함하는 내 대답은 다음과 같습니다.

각 전문화는 각각 클래스이므로 고유 한 myvar 사본을 갖게됩니다. 섹션 14.7템플릿 인스턴스화 및 전문 말한다 단락의 C++ 표준 초안 (강조 광산) : 템플릿 에서 인스턴스화

각 클래스 템플릿 특수화 정적 멤버의 복사본을 가지고있다.

[ Example: 
template<class T> class X { 
    static T s; 
}; 
template<class T> T X<T>::s = 0; 
X<int> aa; 
X<char*> bb; 

X에는 유형이 정적 인 구성원 s가 있고 X에는 char * 유형의 정적 구성원 s가 있습니다. -end 예]

7

예, 두 개의 다른 값을 갖는 두 개의 변수가 있습니다. 그러나 그 두 가지는 전혀 관련이없는 클래스입니다. 이것이 템플릿 작동 방식입니다. 그것들을 클래스라고 생각하지 말고, 클래스가 만들어진 후의 규칙 세트라고 생각하십시오.

+1

STL은 한 번 말했습니다 ("템플릿은 쿠키 커터입니다. 쿠키 커터는 먹을 수 없지만 쿠키 커터로 먹을 수있는 쿠키를 만들 수 있습니다"). :피 – Simple

1

완전히 '새로운 클래스는' '각 유형 이름'에 대한 템플릿에서 인스턴스화됩니다. 그리고 정적 멤버가 클래스에 묶여 있기 때문에 이들 클래스 각각은 정적 변수의 복사본을 가지고 있습니다.