2016-09-16 15 views
1

Как написать тело деструктора вне линии для класса шаблона с аргументом std :: enable_if?определение строки для деструктора в классе enabled-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 (и НКА по праву дросселей в этой форме).

Примечания (2): Я попытался найти это в Интернете, но большинство ответов, которые я нашел, касалось того, как частично специализировать деструктор.

ответ

2

Как насчет этого?

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

Просто называя второй параметр.

Я также удалил значение по умолчанию, потому что вы не можете дважды указывать значения по умолчанию (объявление и определение).