Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens une erreur « Référence non définie à » avec les constructeurs de classes de modèles en C ?
En programmation C, les classes de modèles sont souvent utilisées pour fournir des fonctionnalités génériques qui peuvent être instanciées avec différents types. Cependant, parfois lors de l'instanciation d'une classe modèle, vous pouvez rencontrer une erreur "référence non définie à".
Cette erreur se produit lorsque le compilateur ne trouve pas l'implémentation du constructeur de la classe modèle. Le compilateur a généralement besoin de voir l'implémentation du constructeur afin de générer le code pour la classe instanciée.
Dans le code fourni, la classe modèle cola est définie dans cola.h fichier d'en-tête, mais l'implémentation est dans le fichier cola.cpp. Lors de la compilation du programme, le compilateur voit la déclaration du modèle dans main.cpp et tente d'instancier implicitement la classe cola avec les types float et string.
Cependant, comme le compilateur n'a pas encore vu l'implémentation du constructeur dans cola.cpp, il ne peut pas générer le code pour ces classes instanciées, ce qui entraîne la "référence non définie à" erreur.
Il existe deux approches pour résoudre ce problème :
Ajouter des instanciations de modèles explicites à la fin de le fichier cola.cpp :
template class cola<float>; template class cola<string>;
Cela demande explicitement au compilateur de générer du code pour le cola classe de modèle avec les types spécifiés.
Déplacer l'implémentation du constructeur de classe de modèle et des fonctions membres dans le fichier d'en-tête (cola.h et nodo_colaypila.h ).
Cela garantit que le compilateur voit l'implémentation lorsqu'il instancie la classe de modèle, éliminant ainsi le besoin de instanciation.
Dans l'approche 1, l'instanciation explicite est effectuée à la fin de l'unité de traduction (un seul fichier compilé). Cela signifie que tout le code de ce fichier doit être compilé avant l'instanciation.
Dans l'approche 2, l'implémentation se trouve dans le fichier d'en-tête, qui est inclus dans chaque unité de traduction qui utilise la classe modèle. En conséquence, l'implémentation est disponible pour le compilateur quel que soit l'ordre de compilation.
Les deux approches sont des solutions valables à l'erreur "référence non définie à" avec les classes de modèles. Le choix dépend des besoins spécifiques du projet. L'instanciation explicite est plus flexible et permet un meilleur contrôle sur les spécialisations de modèles générées. Cependant, déplacer l'implémentation vers des fichiers d'en-tête est plus courant et offre plus de flexibilité dans l'utilisation de la classe modèle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!