In C++, i modelli sono solo una meta-definizione di una classe reale. Quando si compila una classe basata su modelli, il compilatore genera effettivamente il codice per la classe effettiva al volo per il particolare tipo di dati passati (il modello è solo un "modello" da copiare).
ad es. Se avete il seguente codice
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();
}
Ciò che il compilatore vede in realtà è
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();
}
Come probabilmente si può vedere, il compilatore in realtà non sa quale codice per generare, fino a che realmente dichiarare un'istanza del tuo modello. Ciò significa che il modello non può essere compilato in una libreria, perché non sa come sarà effettivamente il template. La buona notizia a questo proposito è che in realtà non è necessario che QUALSIASI libreria venga compilata o inclusa se si distribuiscono semplicemente i file di intestazione che includono la definizione del modello.
Inoltre, come nota a margine, il comando di pre-compilatore "#include" in realtà dice al pre-compilatore di sostituire "#include" con qualsiasi cosa proveniente da quel file.
fonte
2009-03-08 14:45:37
È meglio scrivere un set di test unitari piuttosto che forzare la creazione di una libreria statica che non ha bisogno di esistere. Dopo tutto, molti compilatori mancheranno errori di base sul codice del template se quel codice template non viene chiamato. – Tom