[[UPDATE]] -> Si #incluyo "Queue.cpp" en mi programa.cpp, funciona bien. Esto no debería ser necesario, ¿verdad?C++ - LNK2019 error símbolo externo sin resolver [constructor y destructor de la clase de plantilla] al que se hace referencia en la función _main
Hola a todos: estoy usando Visual Studio 2010 y tengo problemas para vincular una implementación de cola rápida y sucia. Comencé con una aplicación de consola vacía Win12, y todos los archivos están presentes en el proyecto. Para verbosidad, aquí está el código completo para duplicar mi error. Me doy cuenta de que parte del código puede, de hecho, estar equivocado. No he tenido la oportunidad de probarlo todavía porque aún no he podido vincularlo.
Queue.hpp
#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;
}
Y los errores ...
Error 1 error LNK2019: unresolved external symbol "public: __thiscall Queue<int>::~Queue<int>(void)" ([email protected]@@[email protected]) 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)" ([email protected]@@[email protected]) referenced in function _main C:\[omitted]\Project2_2\Project2_2\program.obj Project2_2
Así como notas generales sobre el código; no es necesario incluir guardias para cada clase en un encabezado, y hacerlo es mucho más probable que entren en conflicto. En su lugar, coloque un protector de inclusión alrededor del encabezado completo, basado en el nombre de archivo de ese encabezado. Es una práctica estándar y es menos probable que se encuentre con otros nombres de archivos. –
Duplicado de [Error de enlazador LNK2019] (http://stackoverflow.com/questions/3680312/linker-error-lnk2019) (Esta pregunta se realiza aproximadamente cinco veces por semana) –