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