enabled-if class 中析构函数的定义越界?

out of line definition for destructor in enabled-if class?

如何为带有 std::enable_if 参数的模板 class 编写外联析构函数体?

(我需要这个来写一个装饰器,为其他对象类型添加一个标识符)。

代码:

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):我试着在网上搜索这个,但我找到的大多数答案都提到了如何仅部分特化析构函数。

这个呢?

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

只是命名第二个参数。

我也去掉了默认值,因为你可能不会给默认值两次(声明和定义)。