我们说我们有以下文件:
foo.h中
namespace ns
{
template <typename T>
class Foo
{
public:
Foo();
~Foo();
void DoIt();
};
}
Foo.cpp中
#include "foo.h"
#include <iostream>
namespace ns
{
template <typename T>
Foo<T>::Foo() { std::cout << "Being constructed." << std::endl; }
template <typename T>
Foo<T>::~Foo() { std::cout << "Being destroyed." << std::endl; }
template <>
void Foo<int>::DoIt()
{
std::cout << "Int" << std::endl;
}
template <>
void Foo<double>::DoIt()
{
std::cout << "Double" << std::endl;
}
template class Foo<int>;
template class Foo<double>;
}
这是进行显式实例化的正确方法吗?假设类型只会与int或double一起用作类型参数?或者您是否还需要在头文件中声明显式特化?
按照我所展示的方式与视觉工作室合作,但同事一直遇到GCC问题(虽然我刚刚检查过,我认为这是由于其他原因造成的,但无论如何我都会发布这个问题)
答案 0 :(得分:5)
[temp.expl.spec] / p6(强调我的):
如果是模板,成员模板或类模板的成员 明确专门然后应宣布专业化 在第一次使用该特化之前会导致一个 隐式实例化发生在每个翻译单元中 发生了这种用途;无需诊断。
事实上,如果你把它们组合在一个TU中,那就是clang和gcc will issue an error。您需要声明这些显式特化。
既然我们非常接近它,我也会引用[temp.expl.spec] / p7,因为我可以:
为函数放置显式特化声明 模板,类模板,变量模板,成员函数 类模板,类模板的静态数据成员,成员 类模板类,类模板的成员枚举, 类模板的成员类模板,成员函数模板 类模板,类模板的静态数据成员模板, 类模板的成员模板的成员函数,成员 非模板类的成员模板的功能,静态数据 非模板类的成员模板,成员函数模板 类模板的成员类等,以及部分的放置 类模板的特化声明,变量模板, 非模板类的成员类模板,静态数据成员 非模板类的模板,类的成员类模板 模板等可以影响程序是否格式正确 到显式专业化的相对定位 声明及其在翻译单元中的实例化要点 如上下文所述。写专业时,请 小心它的位置;或者使它编译将是这样的试验 点燃自焚。