2016-09-16 1 views
1

Comment écrire le corps destructeur hors-ligne, pour une classe de modèle avec un argument std :: enable_if?définition hors ligne pour destructeur dans la classe enabled-if?

(J'ai besoin de ceci pour écrire un décorateur, en ajoutant un identifiant à d'autres types d'objets).

code:

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 
}; 

définition du corps:

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

Cela ne compile pas parce IdentifiedInstance:: devrait être IdentifiedInstance<T, ???>::.

Quelle est la deuxième valeur de paramètre ici? Comment écrire correctement ceci?

Notes (1):

Visual Studio 2015 accepte cette forme:

template<typename T, 
typename std::enable_if<std::is_base_of<X,T>::value>::type* = nullptr> 
class IdentifiedInstance: public T 
{ 
public: 
    ~IdentifiedInstance() = 0 
    { 
    } 
}; 

Malheureusement le code que j'écris doit être construit aussi sous linux (et gcc selfs à juste titre sur ce formulaire).

Notes (2): J'ai essayé de le rechercher en ligne, mais la plupart des réponses que j'ai trouvées concernaient la spécialisation partielle du destructeur.

Répondre

2

Que pensez-vous de cela?

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

Juste en nommant le deuxième paramètre.

J'ai également supprimé la valeur par défaut, car vous ne pouvez pas donner deux fois les valeurs par défaut (déclaration et définition).