Вы должны использовать extern template
только для того, чтобы компилятор не создавал шаблон, когда вы знаете , что он будет создан где-то еще.Он используется для уменьшения времени компиляции и размера объектного файла.
Например:
// header.h
template<typename T>
void ReallyBigFunction()
{
// Body
}
// source1.cpp
#include "header.h"
void something1()
{
ReallyBigFunction<int>();
}
// source2.cpp
#include "header.h"
void something2()
{
ReallyBigFunction<int>();
}
Это приведет к созданию следующих объектных файлов:
source1.o
void something1()
void ReallyBigFunction<int>() // Compiled first time
source2.o
void something2()
void ReallyBigFunction<int>() // Compiled second time
Если обафайлы связаны друг с другом, один void ReallyBigFunction<int>()
будет отброшен, что приведет к потере времени компиляции и размера файла объекта.
Чтобы не тратить время компиляции и размер файла объекта, есть ключевое слово extern
, которое делает компиляторне скомпилировать шаблонную функцию.Вам следует использовать этот тогда и только тогда, когда вы знаете, , что он используется в том же двоичном файле где-то еще.
Изменение source2.cpp
на:
// source2.cpp
#include "header.h"
extern template void ReallyBigFunction<int>();
void something2()
{
ReallyBigFunction<int>();
}
приведет кследующие объектные файлы:
source1.o
void something1()
void ReallyBigFunction<int>() // compiled just one time
source2.o
void something2()
// No ReallyBigFunction<int> here because of the extern
Когда оба они будут связаны друг с другом, второй объектный файл будет просто использовать символ из первого объектного файла.Нет необходимости отбрасывать, не тратить время на компиляцию и размер объектного файла.
Это следует использовать только внутри проекта, например, когда вы используете шаблон, например vector<int>
несколько раз, вы должны использовать extern
во всех файлах, кроме одного.
Это также относится к классам и функциям как единым, и даже к функциям-членам шаблона.