2014-06-20 1 views
7

명시 적 인스턴스화 (템플릿에서 헤더를 선언 할 때 사용되는 IIRC 및 그렇지 않으면 링커가 다른 곳에서 사용할 때이를 찾을 수 없기 때문에 cpp 파일에 정의 된 경우 사용됨) 템플릿에 정적 멤버 변수 명시 적 인스턴스화는 또한 정적 멤버 변수를 인스턴스화하고 생성합니까?템플릿을 인스턴스화하면 정적 데이터 멤버가 인스턴스화됩니까?

+0

왜 그냥 시도해 보지 않았습니까? O_o –

+1

@ TonyD 그 이유는 OP가 사용하는 컴파일러와 링커에 특정한 대답을 줄 수 있기 때문입니다. – Angew

+0

@Angew : 예 - 컴파일러와 링커가 버그로 가득 차게 되었기 때문입니다. –

답변

3

명시 적으로 클래스 템플릿을 인스턴스화하면 정의가있는 경우에만 static 데이터 멤버를 포함하여 템플릿이 아닌 모든 멤버가 인스턴스화됩니다. 예를 들어 : 하단에

template <typename T> 
struct foo { 
    static int static_data; 
    void non_template_member() {} 
    template <typename S> 
    void template_member(S) {} 
}; 

template <typename T> 
int foo<T>::static_data = 0; 

template struct foo<int>; 
template struct foo<double>; 

명시 적 인스턴스화는 유형 intdouble에 대한 static_datanon_template_member()에 대한 정의를 만들 수 있습니다. template_member(S)에 대한 정의는 아직 공개되지 않았으므로 없습니다.

static_data에 [templated] 정의를 제공하지 않으면 해당 정의가 인스턴스화되지 않습니다.

표준의 관련 부분은 14.7.2 [temp.explicit] 제 8 클래스 템플릿 특수화도 명시 적 동종의 실체화 (선언 또는 정의이다 이름

명시 인스턴스화)을 사용하여 명시 적 인스턴스화를 포함하는 변환 단위에서 이전에 명시 적으로 특화된 적이없는 각 구성원 (기본 클래스에서 상속 된 구성원 및 템플리트 인 구성원 제외)을 작성합니다.

멤버 정의가 없으면 static 멤버 만 선언되고 명시 적 인스턴스화는 인스턴스가 생성되는 것을 볼뿐입니다. 정의를 통해 명시적인 인스턴스화가 정의가됩니다.

1

클래스 템플릿의 명시적인 인스턴스화는 정적 데이터 멤버도 인스턴스화합니다. 당 C++ 11 [temp.explicit]/8

클래스 템플릿 특성화는 그 멤버의 각각의 동종 명시 실체화 (선언 또는 정의)이다 이름 명시 인스턴스화 ( 클래스에서 상속 된 멤버는 제외). 명시 적으로 인스턴스화가 포함 된 변환 단위에서 명시 적으로 특수화되지 않은 멤버 (아래 설명 된 경우 제외). [참고 : 또한 일반적으로 클래스에 대한 특정 구현 종속 데이터 의 명시적인 인스턴스화가됩니다. -end 참고]

그리고 없음 경우 정적 데이터 구성원에 적용되는 "설명".

관련 문제