我知道只要我事先声明它将被实例化的参数,就可以在标题中声明模板及其在源文件中的定义。我的问题是:将明确的实例化放在.h文件中会产生问题吗?它似乎工作,但我总是看到人们把它们放在源文件中,而不是在.h
我想到的是以下
.h文件
class foo
{
public:
template <typename T>
void do(const T& t);
};
template<> void foo::do<int>(const int&);
template<> void foo::do<std::string>(const std::string&);
.cpp文件
template <int>
void foo::do(const int& t)
{
// Do something with t
}
template <std::string>
void foo::do(const std::string& t)
{
// Do something with t
}
答案 0 :(得分:2)
这些被称为显式专业化。显式实例化是另一回事。
将这些声明放在头文件中很好,这是一个非常好的主意。编译其他源文件时,您希望编译器知道不使用主模板生成这些特化。
但* .cpp文件中的语法错误。定义应该更像声明:
template <>
void foo::do<int>(const int& t)
{
// Do something with t
}