C ++ - Erreur externe LNK2019 non résolue [constructeur et destructeur de classes de modèles] référencé dans la fonction _main
[[Mise à JOUR]] -> Si j' #include "Queue.cpp" dans mon program.cpp il fonctionne très bien. Cela ne devrait pas être nécessaire, droit?
Salut à tous, je suis à l'aide de Visual Studio 2010 et de la difficulté à liaison rapide et sale de la File d'attente de la mise en œuvre. J'ai commencé avec un vide Application Console Win32, et tous les fichiers sont présents dans le projet. Pour le niveau de verbosité, voici le code complet pour dupliquer mon erreur. Je sais que certains le code peut, en fait, être faux. Je n'ai pas eu la chance de le tester encore car je n'ai pas encore été en mesure de faire un lien.
File d'attente.php
#ifndef ERROR_CODE
#define ERROR_CODE
enum Error_Code
{
Success,
Underflow,
Overflow
};
#endif //ERROR_CODE
#ifndef QUEUE
#define QUEUE
template<class T>
struct Queue_Node
{
T data;
Queue_Node *next;
Queue_Node()
{
next = NULL;
}
Queue_Node(T pData)
{
data = pData;
next = NULL;
}
Queue_Node(T pData, Queue_Node *pNext)
{
data = pData;
next = pNext;
}
};
template<class T>
class Queue
{
public:
Queue();
Error_Code Serve();
Error_Code Append(T item);
T Front();
~Queue();
private:
void Rescursive_Destroy(Queue_Node<T> *entry);
Queue_Node<T> *front, *rear;
};
#endif //QUEUE
Queue.cpp
#include "Queue.hpp"
template <class T>
Queue<T>::Queue()
{
this->front = this->rear = NULL;
}
template<class T>
Error_Code Queue<T>::Serve()
{
if(front == NULL)
return Underflow;
Queue_Node *temp = this->front;
this->front = this->front->next;
delete temp;
}
template<class T>
Error_Code Queue<T>::Append(T item)
{
Queue_Node *temp = new Queue_Node(item);
if(!temp)
return Overflow;
if(this->rear != NULL)
this->rear->next = temp;
this->rear = temp;
return Success;
}
template<class T>
T Queue<T>::Front()
{
if(this->front == NULL)
return Underflow;
return this->front->data;
}
template<class T>
Queue<T>::~Queue()
{
this->Rescursive_Destroy(this->front);
}
template<class T>
void Queue<T>::Rescursive_Destroy(Queue_Node<T> *entry)
{
if(entry != NULL)
{
this->Recursive_Destroy(entry->next);
delete entry;
}
}
program.cpp
#include "Queue.hpp"
int main()
{
Queue<int> steve;
return 0;
}
Et les erreurs...
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Queue<int>::~Queue<int>(void)" (??1?$Queue@H@@QAE@XZ) referenced in function _main C:\[omitted]\Project2_2\Project2_2\program.obj Project2_2
Error 2 error LNK2019: unresolved external symbol "public: __thiscall Queue<int>::Queue<int>(void)" (??0?$Queue@H@@QAE@XZ) referenced in function _main C:\[omitted]\Project2_2\Project2_2\program.obj Project2_2
source d'informationauteur Squirrelsama
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas suivre le "L'Inclusion De Modèle"? Je vous recommande de suivre ce modèle.
Le compilateur a besoin d'avoir accès à l'ensemble de définition de modèle (et pas seulement de la signature) afin de générer du code pour chaque instanciation du modèle, de sorte que vous devez déplacer les définitions des fonctions de votre en-tête.
Remarque: En général, la plupart des compilateurs C++ ne sont pas facilement prendre en charge la compilation séparée modèle pour les modèles.
En outre, vous devez lire c'.
L'éditeur de liens erreurs parce qu'il voit les fichiers d'en-tête de la File d'attente.hpp, mais ne pas voir les définitions des fonctions. C'est parce qu'il est une classe de modèle, et pour le C++, les définitions de modèles doit être dans le fichier d'en-tête (il y en a quelques autres options, mais c'est la solution la plus simple). Déplacer les definitions des fonctions de Queue.cpp pour la File d'attente.hpp et il doit compiler.
Tous les modèles de code doivent être accessibles lors de la compilation. Déplacer le Queue.cpp détails de mise en œuvre dans l'en-tête de sorte qu'ils sont disponibles.
Si vous avez:
Et vous n':
Le compilateur a besoin de générer (instancier) cette fonction. Mais il ne peut pas le faire à moins que la définition de la fonction est visible au moment de l'instanciation.
Cela signifie modèle définitions des besoins de l'être, en quelque sorte, dans l'en-tête. (Vous pouvez inclure le
.cpp
à la fin de l'en-tête, ou tout simplement de fournir les définitions de la ligne.)Un exemple pour la résolution de l'erreur lnk2019:
Il faut écrire #include "EXAMPLE.cpp" à la fin de l' .h fichier
Dans le .fichier cpp faire comme suit