"cpp에서 Type을 초기화하면 링커 오류가 발생합니다."라는 것이 무슨 뜻인지 확실하지 않습니다. 그러나 실제로는 이으로 정의되었다고 가정하면, 적절한 위치에있는 모든 유형의 정적 멤버를 확실히 정의 할 수 있기 때문에 잘못된 결과가 발생했을 것입니다! 클래스 템플릿에있는 것은 객체의 선언이며 이것을 참조하면 어딘가에 정의해야합니다. MyType
이 필수 유형 인 경우에만 [템플릿] 클래스에서 초기화하면 절대 정의하지 않고 빠져 나간 것처럼 주소가 필요하지 않습니다 (예 : 상수 참조에 바인딩하거나 주소를 가져옴). 이 경우 항상 상수 표현으로 취급되기 때문입니다.
내 생각 엔 당신이 어떤 CPP 파일에서이 같은 개체 뭔가를 정의하려고한다는 것입니다 : 당신은 또한 같은 번역 단위에서 명시 적 또는 암시 적으로이 정의를 인스턴스화하지 않는 한이 작동하지 않습니다
template <typename T> MyType const MyClass<T>::Type = some-initialization-here;
. 당신은 실제로 당신이 일반적으로 측면 단계 수있는 경우 문제를 상수 표현으로 유형을 필요로하지 않는 한 그에게 enum
을함으로써 필요한 경우
template <> MyType const MyClass<T>::Type = some-initialization-here;
:이 같은 특정 유형의 뭔가 구성원을 정의 할 수 있습니다
template <typename T>
MyType const& MyClass<T>::Type() {
static MyType rc = some-initialization-here;
return rc;
}
가 BTW, 나는 ': 대신 헤더에 정의 할 수 있습니다 정적 멤버 함수를 사용할 수 있습니다 (이것은이 사람이 정의를 필요로하지 않고 const
참조에 바인드 할 수 있기 때문에 내가하는 경향 것입니다) 확실히이 질문에 대한 답변은 전에 확실히 comp.lang.c++.moderated입니다.
"머리글 내부에서 초기화 형식을 사용하면 여러 번 초기화 될 수 있습니다." 어떻게 그 일을 정확하게 할 수 있습니까? 생성자가 두 번 이상 호출되는지 여부를 단순히 확인하는 경우 템플릿 클래스 인스턴스화 당 하나의 멤버가 있으므로 두 번 이상 호출해야합니다. – hvd