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 ?

Pourquoi est-ce que j'obtiens une erreur « Référence non définie à » avec les constructeurs de classes de modèles en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-13 17:55:13939parcourir

Why Do I Get an

"Référence non définie au" constructeur de classe de modèle

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.

Problème

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.

Solution

Il existe deux approches pour résoudre ce problème :

Approche 1 : Instanciation de modèle explicite

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.

Approche 2 : déplacer l'implémentation vers les fichiers d'en-tête

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.

Fichier d'en-tête vs unité de traduction

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn