Les classes et les fonctions modélisées ne sont pas instanciées tant qu'elles ne sont pas utilisées, généralement dans un fichier .cpp distinct (par exemple, la source du programme). Lorsque le modèle est utilisé, le compilateur a besoin du code complet de cette fonction pour pouvoir construire la fonction correcte avec le type approprié. Cependant, dans ce cas, le code de cette fonction est détaillé dans le fichier source du modèle et n'est donc pas disponible.
Le résultat de tout cela est que le compilateur suppose qu'il est défini ailleurs et insère seulement l'appel à la fonction modèle. Lorsqu'il s'agit de compiler le fichier source du modèle, le type de modèle spécifique qui est utilisé dans la source du programme n'est pas utilisé, de sorte qu'il ne génère toujours pas le code requis pour la fonction. Il en résulte un symbole externe non résolu.
Les solutions disponibles pour cela sont les suivantes :
- inclure la définition complète de la la fonction membre dans le fichier d'en-tête du modèle et ne pas avoir un fichier source pour le modèle,
-
définir toutes les fonctions membres dans le fichier source du modèle comme "en ligne" (Mise à jour : [cela ne fonctionne pas sur Visual Studio 2017+]), ou
-
définir les fonctions membres dans la source du modèle avec le mot-clé "export". Malheureusement, ceci n'est pas supporté par beaucoup de compilateurs. (Mise à jour : Ceci a été supprimé de la norme à partir de C++11. .)
Les points 1 et 2 résolvent le problème en donnant au compilateur l'accès au code complet de la fonction modèle lorsqu'il tente de construire la fonction typée dans la source du programme.
0 votes
Voir aussi stackoverflow.com/questions/495021/