【发布时间】:2011-10-06 00:07:58
【问题描述】:
我想了解模板专业化的问题。我正在使用 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;
应该放在头文件中,因为编译器不能根据调用代码特化模板,但在完全特化的情况下,是类的实现,因此特化的模板方法应该已经作为公共符号存在。有人可以解释一下这个问题吗?
【问题讨论】:
标签: c++ templates visual-c++