2010-09-26 6 views
0

J'ai une classe Helper:problème avec des paramètres spécialisation de modèle et le modèle de modèle

template <typename T, template <typename> E> 
class Helper { 
    ... 
}; 

J'ai un autre modèle de classe, Exposure, qui doit hériter de Helper en se passant comme paramètre de modèle de modèle E. J'ai également besoin de spécialiser Exposure. Ainsi je veux écrire quelque chose comme ceci:

template <> 
class Exposure<int> : public Helper<int, Exposure> { 
    Exposure() : Helper<int, Exposure>() { 
     ... 
    }; 
    ... 
}; 

Malheureusement ceci ne compilera pas. gcc se plaint:

Exposure.h:170: error: type/value mismatch at argument 2 in template parameter list for `‘template > class ExposureHelper’

Exposure.h:170: error: expected a constant of type ‘’, got ‘Exposure’

Est-ce que je fais quelque chose de mal? Y a-t-il une solution de contournement pour ce que j'essaie de faire?

Répondre

0

Dans votre premier modèle pour Helper, vous n'avez pas besoin de dire que le second paramètre est un modèle:

template <typename T, typename E> 
class Helper { 
    ... 
}; 

Et vous pouvez déclarer un avec un modèle comme argument:

Helper<vector<int>, vector<char> > h; 

Mais dans votre deuxième modèle, vous avez une définition circulaire. Votre classe d'exposition dépend de votre classe d'exposition. Cela crée une référence circulaire et la classe Helper a besoin de la définition d'exposition avant de pouvoir hériter de l'exposition. Vous devrez peut-être restructurer vos classes.

2

si vous voulez vraiment passer modèle plutôt que la classe

template <typename T, template<typename> class E> 
class Helper { 
}; 

template <typename T> 
class Exposure; 

template <> 
class Exposure<int> : public Helper<int, Exposure > { 
}; 

ou si votre intention est différente

template <typename T, typename E> 
class Helper { 
}; 

template <typename T> 
class Exposure; 

template <> 
class Exposure<int> : public Helper<int, Exposure<int> > { 
}; 
Questions connexes