En C++, las plantillas son solo una meta-definición de una clase real. Cuando compila una clase con plantilla, el compilador realmente genera el código de la clase real sobre la marcha para el tipo particular de datos pasados (la plantilla es solo un "patrón" para copiar).
p. Ej. Si usted tiene el siguiente código
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();
}
Lo que el compilador realmente ve es
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();
}
Como podrán ver, el compilador no sabe en realidad lo que el código para generar, hasta que realmente se declara una instancia de tu plantilla. Esto significa que la plantilla no se puede compilar en una biblioteca, porque no sabe en qué terminará realmente la plantilla. La buena noticia sobre esto es que en realidad no necesita que se compile ni se incluya CUALQUIER biblioteca si solo distribuye los archivos de encabezado que incluyen la definición de la plantilla.
Además, como nota al margen, el comando del compilador previo '#include' simplemente le dice al precompilador que reemplace el '#include' con todo lo de ese archivo.
Le conviene más escribir un conjunto de pruebas unitarias que forzar la creación de una biblioteca estática que no necesita existir. Después de todo, muchos compiladores perderán errores muy básicos en el código de plantilla si no se llama al código de esa plantilla. – Tom