2010-04-20 3 views
2

Je suis en train de déconner avec la spécialisation de modèle et j'ai rencontré un problème en essayant de spécialiser le constructeur en fonction de la politique utilisée. Voici le code que j'essaie de mettre au travail.Spécialisation d'un constructeur de modèle de classe

#include <cstdlib> 
#include <ctime> 

class DiePolicies { 
public: 
class RollOnConstruction { }; 
class CallMethod { }; 
}; 

#include <boost/static_assert.hpp> 
#include <boost/type_traits/is_same.hpp> 
template<unsigned sides = 6, typename RollPolicy = DiePolicies::RollOnConstruction> 
class Die { 
// policy type check 
BOOST_STATIC_ASSERT((boost::is_same<RollPolicy, DiePolicies::RollOnConstruction>::value || 
     boost::is_same<RollPolicy, DiePolicies::CallMethod>::value)); 
unsigned m_die; 
unsigned random() { return rand() % sides; } 
public: 
Die(); 
void roll() { m_die = random(); } 
operator unsigned() { return m_die + 1; } 
}; 

template<unsigned sides> 
Die<sides, DiePolicies::RollOnConstruction>::Die() : m_die(random()) { } 
template<unsigned sides> 
Die<sides, DiePolicies::CallMethod>::Die() : m_die(0) { } 

... \ main.cpp (29): erreur C3860: liste des arguments de modèle suivant le nom de modèle de classe doit énumérer les paramètres dans l'ordre utilisé dans la liste des paramètres du modèle ... \ main.cpp (29) : erreur C2976: 'Meurtre': trop peu d'arguments de modèle ... \ main.cpp (31): erreur C3860: liste d'arguments de modèle suivant le nom de modèle de classe doit lister les paramètres dans l'ordre utilisé dans la liste de paramètres de modèle

sont les erreurs que je reçois dans Microsoft Visual Studio 2010. Je pense soit que je ne peux pas trouver la bonne syntaxe pour la spécialisation, ou peut-être qu'il n'est pas possible de le faire de cette façon.

+0

duplication possible de http://stackoverflow.com/questions/1902827/c-template-specialization-of-constructor –

Répondre

5

Votre constructeur n'est pas une fonction modèle. Vous devriez spécialiser toute la classe.

Questions connexes