Рисунок 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
, чтобы избежать нескольких одинаковых настроек. Это только для классов или функций?