그림 1 : 기능 템플릿
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
//...
}
//explicit instantation
template void f<T>();
Main.cpp
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
f<char>();
return 0;
}
을 사용하는 올바른 방법입니까 extern template
, 아니면 그림 2와 같이 클래스 템플릿에만이 키워드를 사용합니까?
그림 2 : 클래스 템플릿
TemplHeader.h
template<typename T>
class foo {
T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
//...
}
//explicit instantation
template class foo<int>;
Main.cpp
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
foo<int> test;
return 0;
}
이 모든 것을 하나의 헤더 파일에 넣는 것이 좋지만 여러 파일에서 동일한 매개 변수로 템플릿을 인스턴스화하면 여러 개의 동일한 정의가 생기고 컴파일러는 오류를 피하기 위해 하나를 제외하고 모두 제거합니다. 어떻게 사용 extern template
합니까? 클래스에만 사용할 수 있습니까, 아니면 함수에도 사용할 수 있습니까?
또한 그림 1과 그림 2는 템플릿이 단일 헤더 파일에있는 솔루션으로 확장 될 수 있습니다. 이 경우 extern template
동일한 인스턴스가 여러 개 발생하지 않도록 키워드를 사용해야합니다 . 이것은 클래스 나 함수에만 해당됩니까?
extern template class foo<int>();
실수 인 것 같습니다.
()
extern 라인 근처 에 'expected unqualified-id'라고 표시되어 있어도 수정합니다 . 책과 비주얼 스튜디오가 모두 잘못되었습니다. g ++ 또는 clang과 같은 표준 호환 컴파일러를 사용하면 문제가 발생합니다.