2010-04-20 2 views
2

Я возился с специализацией шаблона, и у меня возникла проблема с попыткой специализации конструктора на основе того, какая политика используется. Вот код, который я пытаюсь работать.Специализация конструктора шаблона класса

#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): ошибка C3860: шаблон списка аргументов следующее имя шаблона класса должны указать параметры в порядке, который используется в списке параметров шаблона ... \ main.cpp (29) : ошибка C2976: «Die»: слишком мало аргументов шаблона ... \ main.cpp (31): ошибка C3860: список аргументов шаблона, следующий за именем шаблона класса, должен перечислять параметры в порядке, используемом в списке параметров шаблона

являются ошибки, которые я получаю в Microsoft Visual Studio 2010. Я думаю, что я не могу понять правильный синтаксис для специализации, или, возможно, это невозможно сделать так.

+0

Возможный дубликат http://stackoverflow.com/questions/1902827/c-template-specialization-of-constructor –

ответ

5

Ваш конструктор не является функцией шаблона. Вы должны специализироваться на всем классе.

Смежные вопросы