Maison >développement back-end >C++ >Pourquoi est-ce que j'obtiens des erreurs « Référence non définie à » pour les constructeurs de classes de modèles et comment puis-je les corriger ?

Pourquoi est-ce que j'obtiens des erreurs « Référence non définie à » pour les constructeurs de classes de modèles et comment puis-je les corriger ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-12 19:58:10750parcourir

Why Do I Get

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

L'erreur du compilateur "référence non définie à..." pour les constructeurs de classe de modèle signifie un manque d'instanciation explicite instructions pour les classes de modèles spécifiques utilisées dans le programme. Ce problème se produit car le compilateur ne compile pas automatiquement le code du modèle jusqu'à ce qu'il soit explicitement requis.

Solution 1 : Instanciation explicite du modèle

Ajouter les instructions d'instanciation explicites du modèle à la fin du fichier d'implémentation (cola .cpp dans ce cas) :

template class cola<float>;
template class cola<string>;

De plus, incluez les lignes suivantes dans nodo_colaypila.cpp :

template class nodo_colaypila<float>;
template class nodo_colaypila<std::string>;

Cela force le compilateur à compiler les classes de modèles requises.

Solution 2 : Inclure l'implémentation dans le fichier d'en-tête

Déplacer le code d'implémentation de cola .cpp et nodo_colaypila.cpp dans cola.h et nodo_colaypila.h, respectivement. Cela garantit la disponibilité des définitions de fonctions dans toutes les unités de traduction utilisant les classes de modèles.

Avantages et inconvénients de chaque solution :

  • Solution 1 :

    • Pro : Plus efficace car il compile uniquement les instances de modèle nécessaires.
    • Inconvénient : Nécessite instanciation manuelle pour chaque classe de modèle souhaitée.
  • Solution 2 :

    • Pro : Plus pratique et flexible, car elle permet de futures instanciations de classes de modèles.
    • Inconvénient : compilation potentiellement plus lente en raison de la génération de code en double pour chaque traduction unité.

Autres fautes de frappe dans le code :

  • Syntaxe du pointeur incompatible dans la déclaration cola.h :
nodo_colaypila<T><T>* ult, pri;

devrait être :

nodo_colaypila<T>* ult, *pri;
  • Manquant #endif à la fin de nodo_colaypila.h.
  • Le paramètre par défaut du constructeur nodo_colaypila doit être défini dans le fichier d'en-tête, pas dans le fichier d'implémentation.

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