标头中的模板显式实例化

时间:2014-06-10 15:58:41

标签: c++ templates

我知道只要我事先声明它将被实例化的参数,就可以在标题中声明模板及其在源文件中的定义。我的问题是:将明确的实例化放在.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
}

1 个答案:

答案 0 :(得分:2)

这些被称为显式专业化。显式实例化是另一回事。

将这些声明放在头文件中很好,这是一个非常好的主意。编译其他源文件时,您希望编译器知道不使用主模板生成这些特化。

但* .cpp文件中的语法错误。定义应该更像声明:

template <>
void foo::do<int>(const int& t)
{
    // Do something with t
}