Hola Buenas Noches 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:
 
#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:
 
$ 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?