如何为带有std :: enable_if参数的模板类编写外部析构函数体?
(我需要这个来编写装饰器,为其他对象类型添加标识符)。
代码:
template<typename T,
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr>
class IdentifiedInstance: public T
{
public:
virtual ~IdentifiedInstance() = 0; // abstract base, still needs a function body
};
身体定义:
template<typename T,
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr>
IdentifiedInstance::~IdentifiedInstance()
{
}
这不会编译,因为IdentifiedInstance::
应为IdentifiedInstance<T, ???>::
。
这里的第二个参数值是多少? 我该如何正确地写这个?
备注(1):
Visual Studio 2015接受此表单:
template<typename T,
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr>
class IdentifiedInstance: public T
{
public:
~IdentifiedInstance() = 0
{
}
};
不幸的是,我编写的代码也需要在linux下构建(并且gcc在这个表单上正确地扼杀)。
注意事项(2):我尝试在线搜索,但我找到了大多数答案,仅提到如何部分专门化析构函数。
答案 0 :(得分:2)
这个怎么样?
template<typename T,
typename std::enable_if<std::is_base_of<X,T>::value>::type* S>
IdentifiedInstance<T,S>::~IdentifiedInstance()
{
}
只需命名第二个参数。
我还删除了默认值,因为您可能不会给出两次默认值(声明和定义)。