RE:Pregunta para el Mogur
Tienes razón en que si metes la función en el .h la función es inline, y el compilador intentará meterla directamente en el código de la función desde la que se invoca (aunque eso no hace que eso no sea un función). De todas formas, si la función es demasiado larga, el compilador olvida el inline, y se convierte en una función normal.
El problema de los templates es a la hora de compilar. En realidad cuando defines el código de un template en C++, el compilador NO CREA CODIGO MAQUINA hasta que no se necesita. Por tanto, si el fuente lo tienes en un fichero .CPP, y generas el .OBJ, no se va a crear nada.
Entonces, en otro fichero distinto incluyes el .h con tus definiciones, y cuando das a compilar, el compilador se lo traga, porque las definiciones están bien, pero a la hora de linkar, hay error, porque no se ha generado el código máquina para tu instanciación particular sustituyendo el tipo template por el tuyo particular.
¿Solución? Meter el código en el .h (como funciones inline). Esa es la solución adoptada en el código fuente de la librería standar de C++ (las STL). De esta forma, cuando el compilador en tu código ve el uso de la clase con un tipo determinado (la instanciación), al tener el código (en la cabecera que has incluido), crea el código máquina en el fichero OBJ de la unidad que lo utiliza, y no da problemas al linkar.
Resumiendo:
--- Fichero miTemplate.h ---
template <class T> class A {
void miFuncion() {...};
}
-- Fichero usoElTemplate.cpp --
#include <miTemplate.h>
A<int> miVble;
...
En el fichero objeto usoElTemplate.obj, aparecerá el c%