In C++ sind Vorlagen nur eine Meta-Definition einer tatsächlichen Klasse. Wenn Sie eine Vorlagenklasse kompilieren, generiert der Compiler tatsächlich den Code für die aktuelle Klasse für den bestimmten Typ der Daten, die übergeben werden (die Vorlage ist nur ein zu kopierendes "Muster").
z.B. Wenn Sie den folgenden Code haben
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();
}
Was ist eigentlich der Compiler sieht, ist
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();
}
Wie Sie wahrscheinlich sehen können, ist der Compiler nicht wirklich wissen, was Code zu generieren, bis Sie tatsächlich eine Instanz deklarieren deiner Vorlage. Dies bedeutet, dass die Vorlage nicht in eine Bibliothek kompiliert werden kann, weil sie nicht weiß, was die Vorlage tatsächlich sein wird. Die gute Nachricht dabei ist, dass Sie eigentlich keine Bibliothek kompilieren oder einbeziehen müssen, wenn Sie nur die Headerdateien verteilen, die die Vorlagendefinition enthalten.
Auch, als eine Randnotiz, sagt der '# include' Pre-Compiler-Befehl eigentlich nur den Pre-Compiler das '# include' mit allem aus dieser Datei zu ersetzen.
Es ist besser, eine Reihe von Komponententests zu schreiben, als die Erstellung einer statischen Bibliothek zu erzwingen, die nicht unbedingt vorhanden sein muss. Schließlich werden viele Compiler sehr grundlegende Fehler im Vorlagencode verpassen, wenn dieser Vorlagencode nicht aufgerufen wird. – Tom