명시 적 인스턴스화 (템플릿에서 헤더를 선언 할 때 사용되는 IIRC 및 그렇지 않으면 링커가 다른 곳에서 사용할 때이를 찾을 수 없기 때문에 cpp 파일에 정의 된 경우 사용됨) 템플릿에 정적 멤버 변수 명시 적 인스턴스화는 또한 정적 멤버 변수를 인스턴스화하고 생성합니까?템플릿을 인스턴스화하면 정적 데이터 멤버가 인스턴스화됩니까?
답변
명시 적으로 클래스 템플릿을 인스턴스화하면 정의가있는 경우에만 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>;
명시 적 인스턴스화는 유형 int
및 double
에 대한 static_data
및 non_template_member()
에 대한 정의를 만들 수 있습니다. template_member(S)
에 대한 정의는 아직 공개되지 않았으므로 없습니다.
static_data
에 [templated] 정의를 제공하지 않으면 해당 정의가 인스턴스화되지 않습니다.
표준의 관련 부분은 14.7.2 [temp.explicit] 제 8 클래스 템플릿 특수화도 명시 적 동종의 실체화 (선언 또는 정의이다 이름
명시 인스턴스화)을 사용하여 명시 적 인스턴스화를 포함하는 변환 단위에서 이전에 명시 적으로 특화된 적이없는 각 구성원 (기본 클래스에서 상속 된 구성원 및 템플리트 인 구성원 제외)을 작성합니다.
멤버 정의가 없으면 static
멤버 만 선언되고 명시 적 인스턴스화는 인스턴스가 생성되는 것을 볼뿐입니다. 정의를 통해 명시적인 인스턴스화가 정의가됩니다.
클래스 템플릿의 명시적인 인스턴스화는 정적 데이터 멤버도 인스턴스화합니다. 당 C++ 11 [temp.explicit]/8
클래스 템플릿 특성화는 그 멤버의 각각의 동종 명시 실체화 (선언 또는 정의)이다 이름 명시 인스턴스화 ( 클래스에서 상속 된 멤버는 제외). 명시 적으로 인스턴스화가 포함 된 변환 단위에서 명시 적으로 특수화되지 않은 멤버 (아래 설명 된 경우 제외). [참고 : 또한 일반적으로 클래스에 대한 특정 구현 종속 데이터 의 명시적인 인스턴스화가됩니다. -end 참고]
그리고 없음 경우 정적 데이터 구성원에 적용되는 "설명".
- 1. 더 많은 객체를 인스턴스화하면 멤버 함수가 더 인스턴스화됩니까?
- 2. 정적 데이터 멤버가 초기화되지 않는 이유는 무엇입니까?
- 3. 정적 멤버가 만들어지고 소멸되면?
- 4. 정적 멤버가 개체를 입력합니까?
- 5. 정적 메서드 안의 정적 멤버가 아닌 것
- 6. LibGDX 정적 멤버가 초기화되지 않았습니다.
- 7. 정적 멤버가 메모리에서 처음으로로드되는 이유
- 8. 정적 멤버가 예상대로 초기화되지 않았습니다.
- 9. C++ : 정적 멤버가 중복 되었습니까?
- 10. 정적 멤버가 초기화되지 않음 처음으로
- 11. Constexpr 건설 및 정적 멤버가
- 12. 클래스 멤버가 콜백 함수가있는 함수 템플릿을 호출합니다.
- 13. 클래스의 정적 데이터 멤버가 내부 링크 또는 외부입니까?
- 14. 정적 블록이 자바 클래스에서 인스턴스화하면 프로그램이 시작하거나 할 때
- 15. 정적 메서드 내에서 Spring.Net 컨텍스트를 인스턴스화하면 메모리 누수가 발생합니다.
- 16. 클래스의 정적 멤버가 만들어지지 않으면 해당 클래스의 정적 멤버가 메모리를 차지합니까?
- 17. 클래스에 포인터 데이터 멤버가 있는지 확인
- 18. 파이썬 : 클래스 정적 멤버가 자신을 가리키고 있습니까?
- 19. 일반 클래스의 정적 멤버가 형식간에 공유됩니다
- 20. 정적 멤버가 메모리를 가져 오는 경우
- 21. 구조체의 정적 const 멤버가 정의되지 않았습니다.
- 22. 정적 멤버가 인스턴스 클래스가 GC되지 않도록합니까?
- 23. 정적 멤버가 포함 된 Javascript의 개인 생성자
- 24. PHP 정적 멤버가 값을 보유하지 않음
- 25. Python 클래스 멤버가 정적 인 것처럼 동작합니까?
- 26. 정적 멤버가 이동 가능하거나 고정되어 있습니까?
- 27. Android에서 파일을 인스턴스화하면 어떻게됩니까?
- 28. 정적 컨텍스트에서 정적 멤버가 아닌 사용이 어떻게 오류를 발생시키지 않습니까?
- 29. 정적 내부 클래스와 정적 멤버가 같은 이름을 공유합니까?
- 30. 데이터 소스에 "기간"이름의 데이터 멤버가 없습니다.
왜 그냥 시도해 보지 않았습니까? O_o –
@ TonyD 그 이유는 OP가 사용하는 컴파일러와 링커에 특정한 대답을 줄 수 있기 때문입니다. – Angew
@Angew : 예 - 컴파일러와 링커가 버그로 가득 차게 되었기 때문입니다. –