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で発生するエラーです。専門分野の正しい構文がわからないか、この方法ではできないのではないかと考えています。

4

1 に答える 1

5

コンストラクターはテンプレート関数ではありません。クラス全体を専門にする必要があります。

于 2010-04-20T04:38:55.027 に答える