Это не для специализаций.Технически то, что вы сделали, плохо сформировано, диагностика не требуется.У вас есть явное объявление объявление , но не соответствует определение .Явная специализация не учитывается при сопоставлении с предоставленной вами декларацией (хотя некоторые компиляторы реализуют ее так, чтобы скрыть факт).
Эта конструкция предназначена для отсрочки создания экземпляра, чтобы компилятор не пытался создать экземпляр шаблона в текущем модуле перевода.Таким образом, вы можете использовать его для полного сокрытия шаблона и показа только для конечного набора типов:
Заголовок:
template <class T>
void fnc();
extern template void fnc<int>(); // The instantiation is elsewhere.
Источник:
template <class T> //common template definition
void fnc()
{
std::cout << "common";
}
template void fnc<int>(); // explicit instantiation
Илизапретить создание часто используемой специализации в каждом TU:
Общий заголовок:
#include <vector>
extern template std::vector<unsigned char>; // look for member definitions elsewhere.
Один исходный файл:
template std::vector<unsigned char>; // The member functions are defined in this TU
В последующем сценарии использования можно сохранитьво время компиляции.