Специализация конструктора шаблона класса - PullRequest
2 голосов
/ 20 апреля 2010

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

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

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

1 Ответ

5 голосов
/ 20 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...