En C++, les modèles sont juste une méta-définition d'une classe réelle. Lorsque vous compilez une classe basée sur un modèle, le compilateur génère réellement le code de la classe réelle à la volée pour le type particulier de données transmises (le modèle est simplement un "modèle" à copier).
par exemple. Si vous avez le code suivant
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();
}
Ce que le compilateur voit réellement est
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();
}
Comme vous pouvez le voir, le compilateur ne sait pas vraiment ce code pour générer, jusqu'à ce que vous déclarez en fait une instance de votre modèle. Cela signifie que le modèle ne peut pas être compilé dans une bibliothèque, car il ne sait pas quel sera le modèle. La bonne nouvelle à ce sujet est que vous n'avez besoin d'AUCUNE bibliothèque pour être compilée ou incluse si vous distribuez simplement les fichiers d'en-tête qui incluent la définition du modèle. En outre, en remarque, la commande de pré-compilateur '#include' indique simplement au pré-compilateur de remplacer '#include' par tout ce qui se trouve dans ce fichier.
Il est préférable d'écrire un ensemble de tests unitaires plutôt que de forcer la création d'une bibliothèque statique qui n'a pas besoin d'exister. Après tout, de nombreux compilateurs manqueront des erreurs très basiques sur le code du template si ce code n'est pas appelé. – Tom