Hola a todos!
Tengo una duda acerca de las templates en C++.
Despues de leer varios tutoriales, por fin pude crear por mi cuenta una Lista Simplemente Enlazada utilizando plantillas y dos clases(Nodo y Lista).
Mi pregunta es:
¿Por que cuando tengo todo mi código junto en un solo archivo, cuando compilo y corro mi programa funciona perfecto, pero cuando separo el codigo en archivos de cabecera(.h y .cpp) mas el main.cpp mi compilador(g++) al momento del enlazado me tira varios errores?
Mi codigo TODO JUNTO el que si funciona es:
Código:
#include <iostream>
using namespace std;
template <class Q>
class Nodo{
private:
Q *MiDato;
Nodo<Q> *next;
public:
Nodo(Q nuevo){
next = NULL;
MiDato = new Q;
*MiDato = nuevo;
}
Nodo(void): MiDato(NULL), next(NULL) {}
~Nodo(void){
delete MiDato;
next = NULL;
}
void set_data(Q nuevo){
MiDato = new Q;
*MiDato = nuevo;
}
void set_next(Nodo<Q> *s) { next = s; }
const Q get_data(void) const { return *MiDato; }
Nodo<Q> *get_next(void) { return next; }
void ShowAll(void) const{
Nodo<Q> *aux = next;
cout << *MiDato << endl;
while(aux){
cout << aux->get_data() << endl;
aux = aux->get_next();
}
}
};
template <class Q>
class Lista{
private:
Nodo<Q> *inicio;
Nodo<Q> *final;
int tam;
public:
Lista(void): inicio(NULL), final(NULL), tam(0) {}
~Lista(void){
Nodo<Q> *aux = inicio;
if(!empty()){
while(inicio){
inicio = inicio->get_next();
delete aux;
aux = inicio;
}
}
final = NULL;
tam = 0;
}
void add(Q nuevo){
Nodo<Q> *aux = new Nodo<Q>(nuevo);
if(empty()){
inicio = aux;
}else{
final->set_next(aux);
}
final = aux;
tam++;
}
int get_tam(void) const { return tam; }
bool empty(void) const{
return (inicio == NULL);
}
void Mostrar(void) const { inicio->ShowAll(); }
};
int main(void){
Lista<int> Buena;
Lista<char> Mala;
for(int i = 10; i < 21; i++){
Buena.add(i);
}
Mala.add('M');
Mala.add('A');
Mala.add('L');
Mala.add('A');
cout << "Buena mide: " << Buena.get_tam() << endl;
Buena.Mostrar();
cout << "\nMala mide: " << Mala.get_tam() << endl;
Mala.Mostrar();
return 0;
}
Y el error que me tira si creo los siguientes 5 archivos:
main.cpp, Nodo.cpp, Nodo.h, Lista.cpp y Lista.h
es:
Código:
$ g++ -c Nodo.cpp
$ g++ -c Lista.cpp
$ g++ main.cpp *.o
/tmp/ccNbYLWk.o: In function `main':
main.cpp:(.text+0x13): undefined reference to `Lista<int>::Lista()'
main.cpp:(.text+0x1f): undefined reference to `Lista<char>::Lista()'
main.cpp:(.text+0x39): undefined reference to `Lista<int>::add(int)'
main.cpp:(.text+0x59): undefined reference to `Lista<char>::add(char)'
main.cpp:(.text+0x6a): undefined reference to `Lista<char>::add(char)'
main.cpp:(.text+0x7b): undefined reference to `Lista<char>::add(char)'
main.cpp:(.text+0x8c): undefined reference to `Lista<char>::add(char)'
main.cpp:(.text+0x98): undefined reference to `Lista<int>::get_tam() const'
main.cpp:(.text+0xcc): undefined reference to `Lista<int>::Mostrar() const'
main.cpp:(.text+0xd8): undefined reference to `Lista<char>::get_tam() const'
main.cpp:(.text+0x10c): undefined reference to `Lista<char>::Mostrar() const'
main.cpp:(.text+0x11d): undefined reference to `Lista<char>::~Lista()'
main.cpp:(.text+0x130): undefined reference to `Lista<char>::~Lista()'
main.cpp:(.text+0x144): undefined reference to `Lista<int>::~Lista()'
main.cpp:(.text+0x160): undefined reference to `Lista<int>::~Lista()'
collect2: ld devolvió el estado de salida 1
$
¿Alguien me puede explicar que sucede?