Bwm*_*mat 4 c++ template-specialization explicit-instantiation
假设我们有以下文件:
foo.h中
namespace ns
{
template <typename T>
class Foo
{
public:
Foo();
~Foo();
void DoIt();
};
}
Run Code Online (Sandbox Code Playgroud)
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>;
}
Run Code Online (Sandbox Code Playgroud)
这是进行显式实例化的正确方法,假设类型只会与int或double一起用作类型参数吗?或者您是否还需要在头文件中声明显式特化?
这样做是我展示的方式与视觉工作室合作,但同事一直遇到GCC问题(虽然我刚刚检查过,我认为这是由于其他原因,但无论如何我都会发布这个问题)
[temp.expl.spec]/p6(强调我的):
如果模板,成员模板或类模板的成员是显式专用的,则应在首次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生此类使用的每个翻译单元中 ; 无需诊断.
事实上,如果你将它们组合在一个TU中,clang和gcc 都会发出错误.您需要声明这些显式特化.
既然我们非常接近它,我也会引用[temp.expl.spec]/p7,因为我可以:
为函数模板,类模板,变量模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员枚举,类模板的成员类模板,成员函数放置显式特化声明类模板的模板,类模板的静态数据成员模板,类模板的成员模板的成员函数,非模板类的成员模板的成员函数,非模板类的静态数据成员模板,成员类的成员函数模板类模板等,以及类模板,变量模板,非模板类的成员类模板,非模板类的静态数据成员模板,类模板的成员类模板等的部分特化声明的放置,可以根据显式specia的相对位置来影响程序是否格式正确 翻译单元中的lization声明及其实例化点,如上下文所述.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.