Это потому, что для специализированного класса не существует поддерживающей реализации.Когда вы используете шаблон, происходит то, что компилятор генерирует символ для этого конкретного использования.Если уже существует предопределенная и полностью шаблонная реализация, то компилятор может сделать свое собственное определение, но только если он видит шаблонную реализацию, когда компилирует файл, пытающийся его использовать.Если он не видит его, он просто создает символ, оставляет его неопределенным и ожидает связать его позже.
В качестве быстрого примера ...
в Template_Add.h
// Generic template
template< class T >
T add(T first, T second);
в Template_Add.cpp
// Specialized for int
template<>
int add<int>(int first, int second){
в main.cpp
#include "Template_Add.h"
int main(){
int ia, ib, ic;
double da, db, dc;
ia = 3;
ib = 4;
da = 3.0;
db = 4.0;
// we expect ia = 7, and works
ic = add(ib, ic);
// we expect dc = 7.0, but doesn't work
// this will result in an unresolved symbol
dc = add(da, db);
return 0;
}
Причиной такого поведения является то, что нигде не существует шаблонной реализации, где main.cpp
может ее увидеть.Однако, когда все связано, компоновщик видит, что «int add (int, int)» существует, и это разрешено.
Если вы владеете шаблоном, вы можете добавить (шаблонную) реализациюв .h файл, содержащий объявление шаблона.Таким образом, компилятор знает, как генерировать символ и определение во время компиляции.Чтобы исправить наш приведенный выше пример, мы могли бы добавить следующий код в Template_Add.h:
template< class T >
T add(T first, T second){
return first + second;
}
... и тогда все, включая «Template_Add.h», сможет генерировать свою собственную реализацию для всего, что пытаетсяиспользуйте шаблон.
Если вы не являетесь владельцем шаблона, лучшее, что вы можете сделать, - это найти способ использовать поддерживаемые специализации шаблона.В этом случае, возможно, было бы лучше привести (* или typedef) ваш char16_t
в short
, а затем посмотреть, работает ли он.