Tengo un problema con la especialización de plantillas que me gustaría entender. Estoy trabajando con Visual C++ 10.0 (2010). Tengo una clase como esta:La especialización de plantillas falla al vincular
class VariableManager
{
public:
template<typename VarT>
VarT get(std::string const& name) const
{
// Some code...
}
// This method supposed to be fully evaluated, linkable method.
template<>
std::string get<std::string>(std::string const& name) const;
private:
std::map<std::string, boost::any> mVariables;
};
En teoría, porque me especialicé el método "get", el enlazador debe ser capaz de recoger a partir de un archivo objeto. En su lugar, me sale un error de referencia sin resolver con el enlazador si coloco el método en el archivo de origen:
template<>
std::string VariableManager::get<std::string>(std::string const& name) const
{
// Doing something...
}
Si coloco este método en el archivo de cabecera como en línea, la construcción va muy bien. Entiendo que las funciones de plantilla como esta:
template<typename VarT>
VarT get(std::string const& name) const;
debe ser colocado en la cabecera porque el compilador no será capaz de especializarse la plantilla de acuerdo con el código de llamada, pero en el caso de la plena especialización es la la implementación de la clase que hace que así el método de plantilla especializado ya debería existir como un símbolo público. ¿Podría alguien arrojar algo de luz sobre este tema?
Es curioso, pero parece que el problema estándar de cumplimiento fue el problema. Eliminé la declaración de la clase e hice la declaración de especialización como sugirió, y el enlazador no tuvo problemas. Es bueno recordar que las especializaciones deben declararse fuera del alcance de la clase. ¡Gracias por su amable ayuda! – progician
Es una verdadera suerte para mí encontrar tu respuesta. Todavía es un misterio para mí lo que hace el compilador si dejo la especialización de plantilla dentro de una clase y lo que hace que el enlazador no pueda encontrarla. Sin embargo, definitivamente salvaste mi día! – Nipheris