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()
{
}
只是命名第二个参数。
我也去掉了默认值,因为你可能不会给默认值两次(声明和定义)。
如何为带有 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()
{
}
只是命名第二个参数。
我也去掉了默认值,因为你可能不会给默认值两次(声明和定义)。