Plantilla C ++, error de enlace

Tengo un problema al llamar a una clase de plantilla que tengo. Decidí un nuevo tipo de nombre Array, que es una plantilla;

En el archivo .hpp:

template  class Array { public: Array(); }; 

En el archivo .cpp:

 template  Array::Array() { //Do something } 

En principal:

 Array arr; 

Obtengo error de vinculación: símbolo externo no resuelto en el controlador.

¿Alguna idea?

    Las funciones de plantilla, incluidas las funciones de miembro, deben escribirse por completo en los archivos de encabezado. Esto significa que si tiene una clase de plantilla, su implementación debe estar completamente en un archivo de encabezado. Esto se debe a que el comstackdor necesita tener acceso a toda la definición de la plantilla (no solo a la firma) para generar código para cada instancia de la plantilla.

    Coloque las definiciones de statement de plantilla y de función de plantilla en el archivo de encabezado. La mayoría de los comstackdores de C ++ no admiten fácilmente el modelo de comstackción separado para plantillas,

    Si la definición de una función con plantilla no es visible en el punto donde se usa (es decir, no está en el encabezado o en el mismo archivo CPP), necesita decirle al comstackdor qué instancias realizar .

    El problema que tiene aquí es que ha ocultado la definición del constructor en el archivo .cpp. Esta definición se aplica a todos los tipos T , incluido T como int que utiliza, pero en realidad no proporciona ninguna definición porque todavía es solo una statement.
    El vinculador no puede encontrar el símbolo Array::Array() .

    Ahora, puedes agregar una línea como esta:

     Array arr1; 

    hasta el final de su archivo Array.cpp y esto hace que el comstackdor crea una instancia de la definición correcta que busca el enlazador. Sin embargo, esto solo proporciona una definición, la de Array y ninguna otra.

    Esta solución funcionará, hasta que necesite una Array de un parámetro de plantilla diferente, por ejemplo, double , en cuyo punto deberá agregar:

     Array arr2; 

    al final de su archivo Array.cpp: ¡ahora puede ver cómo es insostenible!

    Si necesita C ++ para trabajar con cualquier tipo que desee en el futuro, ahora es el momento de mover la definición del ctor (y presumiblemente todas las demás funciones miembro) al encabezado (y eliminar el archivo .cpp como se no tendrá nada en ella).

    Como se mencionó anteriormente, en plantillas en C ++ el comstackdor ejecuta el proceso de nuevos métodos en tiempo de comstackción, el problema es que necesita conocer toda la definición de thm durante ese tiempo, por lo que toda statement de clase / función debe ser ar h o hpp archivos.

    Otra respuesta, compile solo su archivo .cpp (no el principal) y verifique el tamaño del archivo objeto, luego cree un archivo empty.cpp y luego compile ese empty.cpp. finalmente compara el tamaño de ambos archivos de objeto. Verás que tienen el mismo tamaño, lo que significa que tu archivo .cpp no ​​es nada para el comstackdor, por lo que el enlazador no puede encontrar nada.