Рисунок 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, і ви побачите проблему.