Estoy trabajando en Visual Studio 2015, esto es lo que llevo:
Nodo.h
Código
#pragma once template<class T> class Nodo { private: Nodo<T>* siguiente; Nodo<T>* anterior; T clave; public: inline Nodo(); inline Nodo(T clave); inline Nodo<T>* getSiguiente(); inline Nodo<T>* getAnterior(); inline T getClave(); inline void setSiguiente(Nodo<T>* siguiente); inline void setAnterior(Nodo<T>* anterior); inline void setClave(T clave); };
Nodo.cpp
Código
#include "Nodo.h" template <class T> inline Nodo<T>::Nodo() { siguiente = nullptr; anterior = nullptr; clave = 0; } template <class T> inline Nodo<T>::Nodo(T clave) { siguiente = nullptr; anterior = nullptr; this->clave = clave; } template <class T> inline Nodo<T>* Nodo<T>::getSiguiente() { return siguiente; } template <class T> inline Nodo<T>* Nodo<T>::getAnterior() { return anterior; } template <class T> inline T Nodo<T>::getClave() { return clave; } template <class T> inline void Nodo<T>::setAnterior(Nodo<T>* anterior) { this->anterior = anterior; } template <class T> inline void Nodo<T>::setSiguiente(Nodo<T>* siguiente) { this->siguiente = siguiente; } template <class T> inline void Nodo<T>::setClave(T clave) { this->clave = clave; }
ListaDoble.h
Código
#pragma once #include "Nodo.h" template <class T> class ListaDoble { private: Nodo<T>* inicio; public: inline ListaDoble(); void agregar(Nodo<T>* n); void eliminar(Nodo<T>* n); void listar(); inline Nodo<T>* getInicio(); };
ListaDoble.cpp
Código
#include "ListaDoble.h" template <class T> inline ListaDoble<T>::ListaDoble() { inicio = nullptr; } template <class T> void ListaDoble<T>::agregar(Nodo<T>* n) { n->setSiguiente(inicio); if (inicio != nullptr) { inicio->setAnterior(n); } n->setAnterior(nullptr); inicio = n; } template <class T> void ListaDoble<T>::eliminar(Nodo<T>* n) { if (n->getAnterior() != nullptr) { n->getAnterior()->setSiguiente(n->getSiguiente()); } else { inicio = n; } if (n->getSiguiente() != nullptr) { n->getSiguiente()->setAnterior(n->getAnterior()); } delete n; } template <class T> inline Nodo<T>* ListaDoble<T>::getInicio() { return inicio; } template <class T> void ListaDoble<T>::listar() { for (Nodo<T>* aux = inicio; aux != nullptr; aux = aux->getSiguiente()) { cout << "Clave: " << aux->getClave() << endl; } }
TablaHash.h
Código
#pragma once #include "ListaDoble.h" #define TAM 701 template <class T> class TablaHash { private: ListaDoble<T>* H[TAM]; public: TablaHash(); void agregar(Nodo<T>* n); void eliminar(Nodo<T>* n); Nodo<T>* buscar(T clave); inline int h(int clave); void listar(); };
TablaHash.cpp
Código
#include "TablaHash.h" template<class T> TablaHash<T>::TablaHash() { for (int h = 0; h < TAM; h++) { H[h] = nullptr; } } template<class T> inline int TablaHash<T>::h(int clave) { return (clave % TAM); } template<class T> void TablaHash<T>::agregar(Nodo<T>* n) { int slot = h((int)n->getClave()); if (H[slot] == nullptr) { H[slot] = new ListaDoble<T>; } H[slot]->agregar(n); } template <class T> Nodo<T>* TablaHash<T>::buscar(T clave) { int slot = h((int)clave); if (H[slot] != nullptr) { for (Nodo<T>* aux = H[slot]->getInicio(); aux != nullptr; aux = aux->getSiguiente()) { if (aux->getClave() == clave) { return aux; } } } return nullptr; } template <class T> void TablaHash<T>::eliminar(Nodo<T>* n) { int slot = h((int)n->getClave()); Nodo<T>* aux = buscar(n->getClave()); if (aux != nullptr) { H[slot]->eliminar(aux); } if (H[slot]->getInicio() == nullptr) { H[slot] = nullptr; delete H[slot]; } } template <class T> void TablaHash<T>::listar() { for (int i = 0; i < TAM; i++) { if (H[i] != nullptr) { H[i]->listar(); } } }
main.cpp
Código
#include <iostream> #include "TablaHash.h" using namespace std; int main() { TablaHash<int> myHashTable; Nodo<int>* nodo1 = new Nodo<int>(25); Nodo<int>* nodo2 = new Nodo<int>(35); Nodo<int>* nodo3 = new Nodo<int>(45); return 0; }
El error que me da es el siguiente:
Código:
- Error LNK2019 unresolved external symbol "public: __thiscall TablaHash<int>::TablaHash<int>(void)" (??0?$TablaHash@H@@QAE@XZ) referenced in function _main
- Error LNK2019 unresolved external symbol "public: __thiscall Nodo<int>::Nodo<int>(int)" (??0?$Nodo@H@@QAE@H@Z) referenced in function _main
- Error LNK1120 2 unresolved externals
Supongo que tiene algo que ver con las cabeceras, ¿alguien podría decirme que estoy haciendo mal?
Gracias de antemano.