Error de referencia no definido para el método de plantilla

Esto me ha estado volviendo loco durante la última hora y media. Sé que es algo pequeño pero no puedo encontrar lo que está mal (el hecho de que sea una tarde de viernes lluvioso, por supuesto, no ayuda).

He definido la siguiente clase que contendrá los parámetros de configuración leídos de un archivo y me permitirá acceder a ellos desde mi progtwig:

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 ); }; 

donde el método convert() se define en VAConfig.cpp como

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

Todo bastante simple. Pero cuando pruebo desde mi progtwig principal usando

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

Obtengo una undefined reference to 'int VAConfig::convert...' error de comstackción undefined reference to 'int VAConfig::convert...' . Lo mismo para readParameter() .

Miró muchos tutoriales de plantillas, pero no pudo resolver esto. ¿Algunas ideas?

La implementación del código .cpp nunca debe estar en un archivo .cpp : su comstackdor debe verlos al mismo tiempo que ve el código que los llama (a menos que use la instanciación explícita para generar el código del objeto con plantilla, pero incluso entonces .cpp es el tipo de archivo incorrecto para usar).

Lo que debe hacer es mover la implementación al archivo de encabezado o a un archivo como VAConfig.t.hpp y luego #include "VAConfig.t.hpp" siempre que utilice funciones de miembros con plantillas.

Si mueve la implementación de los métodos con plantilla (convert and readParameter) al archivo de encabezado, debería funcionar.

El comstackdor debe tener acceso a las implementaciones de funciones con plantilla en los puntos donde se crean instancias.

Un método de plantilla es simplemente una … plantilla para un método. Los argumentos de la plantilla deben cumplimentarse cuando el método se “ejemplifica”.

Debería ser posible construir un comstackdor que esté conforme con la statement de un método de plantilla, y tener un paso de “comstackción de plantilla” comstackr todas las instancias necesarias del método de plantilla.

Este no es el caso para microsoft’s vc. Sin embargo, escuché a un colega murmurar que era el caso en Unix.

La mayoría de los comstackdores instancian el método de la plantilla bajo pedido, donde se usan en el código fuente. Para instanciar el método, el comstackdor debe ‘ver’ el cuerpo de la función de la plantilla. Es por eso que el cuerpo generalmente se coloca en el archivo de encabezado o, por ejemplo, en un archivo .h.cpp, que luego se incluye como la última línea del archivo .h.