В c ++ шаблоны - это просто мета-определение фактического класса. Когда вы компилируете шаблонный класс, компилятор фактически генерирует код для фактического класса на лету для конкретного типа передаваемых данных (шаблон - это просто «шаблон» для копирования).
например. Если у вас есть следующий код
struct MyTemplate
{
private:
float MyValue;
public:
float Get() { return MyValue; }
void Set(float value) { MyValue = value; }
};
void main()
{
MyTemplate v1;
MyTemplate v2;
v1.Set(5.0f);
v2.Set(2);
v2.Get();
}
На самом деле компилятор видит
struct CompilerGeneratedNameFor_MyTemplate_float
{
private:
float MyValue;
public:
float Get() { return MyValue; }
void Set(float value) { MyValue = value; }
};
struct CompilerGeneratedNameFor_MyTemplate_int
{
private:
int MyValue;
public:
int Get() { return MyValue; }
void Set(int value) { MyValue = value; }
};
void main()
{
CompilerGeneratedNameFor_MyTemplate_float v1;
CompilerGeneratedNameFor_MyTemplate_int v2;
v1.Set(5.0f);
v2.Set(2);
v2.Get();
}
Как вы, вероятно, видите, компилятор на самом деле не знает, какой код генерировать, пока вы фактически не объявите экземпляр вашего шаблона. Это означает, что шаблон не может быть скомпилирован в библиотеку, потому что он не знает, чем на самом деле будет шаблон. Хорошей новостью является то, что вам на самом деле не нужна ЛЮБАЯ библиотека для компиляции или включения, если вы просто распространяете заголовочные файлы, содержащие определение шаблона.
Также, как примечание, команда прекомпилятора '#include' на самом деле просто говорит прекомпилятору заменить '#include' всем из этого файла.