Erro de referência indefinido para o método de modelo

Isso tem me deixado louco pela última hora e meia. Eu sei que é uma coisa pequena, mas não consigo encontrar o que está errado (o fato de que é uma tarde chuvosa de sexta-feira, é claro, não ajuda).

Eu defini a seguinte class que conterá parâmetros de configuração lidos de um arquivo e me permitirá acessá-los do meu programa:

class VAConfig { friend std::ostream& operator<<( std::ostream& lhs, const VAConfig& rhs); private: VAConfig(); static std::string configFilename; static VAConfig* pConfigInstance; static TiXmlDocument* pXmlDoc; std::map valueHash; public: static VAConfig* getInstance(); static void setConfigFileName( std::string& filename ) { configFilename = filename; } virtual ~VAConfig(); void readParameterSet( std::string parameterGroupName ); template T readParameter( const std::string parameterName ); template T convert( const std::string& value ); }; 

onde o método convert() é definido em VAConfig.cpp como

 template  T VAConfig::convert( const std::string& value ) { T t; std::istringstream iss( value, std::istringstream::in ); iss >> t; return t; } 

Tudo bem simples. Mas quando eu testo do meu programa principal usando

 int y = parameters->convert("5"); 

Eu recebo uma undefined reference to 'int VAConfig::convert...' erro de compilation undefined reference to 'int VAConfig::convert...' . Idem para readParameter() .

Analisamos muitos tutoriais de modelos, mas não podemos descobrir isso. Alguma ideia?

A implementação de código templado nunca deve estar em um arquivo .cpp : seu compilador precisa vê-los ao mesmo tempo em que vê o código que os chama (a menos que você use instanciação explícita para gerar o código object modelado, mas mesmo assim .cpp é o tipo de arquivo errado a ser usado).

O que você precisa fazer é mover a implementação para o arquivo de header ou para um arquivo como VAConfig.t.hpp e #include "VAConfig.t.hpp" sempre que você usar qualquer function de membro #include "VAConfig.t.hpp" .

Se você mover a implementação dos methods modelados (convert e readParameter) para o arquivo de header, isso deve funcionar.

O compilador deve ter access às implementações de funções modeladas nos pontos em que são instanciadas.

Um método de modelo é meramente um modelo para um método. Os argumentos do modelo devem ser preenchidos onde o método é “instanciado”.

Deve ser possível construir um compilador que esteja satisfeito com a declaração de um método de template, e tenha uma etapa de ‘compilation de template’ compilar todas as instâncias necessárias do método template.

Este não é o caso do vc da microsoft. Eu ouvi um colega murmurar sobre ser o caso no unix, no entanto.

A maioria dos compiladores instancia o método de modelo sob solicitação, onde eles são usados ​​no código-fonte. Para instanciar o método, o compilador deve ‘ver’ o corpo da function de modelo. É por isso que o corpo geralmente é colocado no arquivo de header ou, por exemplo, no arquivo .h.cpp, que é incluído como a última linha do arquivo .h.