Modelo C ++, ligando erro

Eu tenho um problema em chamar uma class de modelo que tenho. Eu declarei um novo tipo de nome Array, que é um modelo;

No arquivo .hpp:

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

No arquivo .cpp:

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

No main:

 Array arr; 

Eu recebo erro Linkage: símbolo externo não resolvido para o ctor.

Qualquer ideia?

Funções de modelo, incluindo funções-membro, devem ser escritas inteiramente nos arquivos de header. Isso significa que, se você tiver uma class de modelo, sua implementação deverá estar totalmente em um arquivo de header. Isso ocorre porque o compilador precisa ter access a toda a definição do modelo (não apenas à assinatura) para gerar código para cada instanciação do modelo.

Coloque a declaração de modelo e as definições de function de modelo no arquivo de header. A maioria dos compiladores C ++ não suportam facilmente o modelo de compilation separado para modelos,

Se a definição de uma function modelada não estiver visível no ponto em que é usada (ou seja, não estiver no header ou no mesmo arquivo CPP), será necessário informar ao compilador quais instanciações devem ser feitas .

O problema que você tem aqui é que você escondeu a definição do construtor no arquivo .cpp. Esta definição se aplica a todos os tipos T , incluindo T como um int que você usa, mas na verdade não fornece nenhuma definição, porque ainda é apenas uma declaração.
O vinculador não pode encontrar o símbolo Array::Array() .

Agora você pode adicionar uma linha como esta:

 Array arr1; 

para o final do seu arquivo Array.cpp e isso faz com que o compilador instancie a definição correta que o vinculador está procurando. No entanto, isso fornece apenas uma definição, a de Array e nenhuma outra.

Essa solução funcionará até que você precise de um Array de um parâmetro de modelo diferente, digamos, double , e nesse ponto você precisaria adicionar:

 Array arr2; 

até o final do seu arquivo Array.cpp – agora você pode ver como isso é insustentável!

Se você precisar que o C ++ funcione com qualquer tipo que você possa desejar no futuro, agora é a hora de mover a definição do ctor (e presumivelmente todas as outras funções-membro) para o header (e excluir o arquivo .cpp como não terá mais nada nele).

Como mencionado acima, em templates em C ++ o processo de novos methods está sendo executado pelo compilador em tempo de compilation, o problema é que ele precisa saber toda a definição de thm durante esse tempo, então toda declaração de class / function deve ser ar h ou hpp arquivos.

Outra resposta, compile apenas seu arquivo .cpp (não o principal) e verifique o tamanho do arquivo do object, em seguida, crie um arquivo empty.cpp e compile o arquivo empty.cpp. Finalmente, compare o tamanho dos dois arquivos de object. Você verá que eles têm o mesmo tamanho, o que significa que seu arquivo .cpp não é nada para o compilador, portanto, o vinculador não consegue encontrar nada.