Рисунок 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>();
похоже на ошибку.
()
с внешней строкой написано «ожидаемый неквалифицированный идентификатор» . и ваша книга, и визуальная студия ошибаются, попробуйте использовать более стандартный компилятор, такой как g ++ или clang, и вы увидите проблему.