У меня проблема со специализацией шаблонов, которую я хотел бы понять. Я работаю с Visual C ++ 10.0 (2010). У меня есть такой класс:
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;
};
Теоретически, поскольку я специализировал метод "get", компоновщик должен иметь возможность получать данные из объектного файла. Вместо этого я получаю неразрешенную ссылочную ошибку с компоновщиком, если я помещаю метод в исходный файл:
template<>
std::string VariableManager::get<std::string>(std::string const& name) const
{
// Doing something...
}
Если я помещаю этот метод в заголовочный файл как встроенный, сборка идет очень хорошо. Я понимаю, что шаблон работает так:
template<typename VarT>
VarT get(std::string const& name) const;
должен быть помещен в заголовок, потому что компилятор не сможет специализировать шаблон в соответствии с вызывающим кодом, но в случае полной специализации именно реализация класса делает это, поэтому специализированный метод шаблона должен уже существуют как общественный символ. Может ли кто-нибудь пролить свет на этот вопрос?