在enabled-if类中析构函数的行外定义?

时间:2016-09-16 12:01:51

标签: c++ destructor template-specialization

如何为带有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):我尝试在线搜索,但我找到了大多数答案,仅提到如何部分专门化析构函数。

1 个答案:

答案 0 :(得分:2)

这个怎么样?

template<typename T,
typename std::enable_if<std::is_base_of<X,T>::value>::type* S>
IdentifiedInstance<T,S>::~IdentifiedInstance()
{
}

只需命名第二个参数。

我还删除了默认值,因为您可能不会给出两次默认值(声明和定义)。