コンパイラ (GCC 4.7.2) には、次のコードに問題があるようです。
template<int BoolSize> struct BoolReg {};
template<> struct BoolReg<1> { static const Jit::RegType Val_t = Jit::u8; };
template<> struct BoolReg<2> { static const Jit::RegType Val_t = Jit::u16; };
template<> struct BoolReg<4> { static const Jit::RegType Val_t = Jit::u32; };
template <class T> struct JitRegType {};
template <> struct JitRegType<bool> { static const Jit::RegType Val_t = BoolReg< sizeof<bool> >::Val_t; };
それは言います:
エラー: テンプレート引数 1 が無効です
上記のコードの最後の行。一方、代わりに整数リテラルを渡すsizeof(bool)
と正常に機能します。
template <> struct JitRegType<bool> { static const Jit::RegType Val_t = BoolReg<1>::Val_t; };
ただし、 a のサイズはbool
標準で指定されていないため、より移植性の高い方法を使用して、 のサイズに応じてレジスタ型を指定したいと思いますbool
。
これは本当に不正な形式の C++11 ですか?
標準は次のように述べています。
非型、非テンプレートのテンプレート パラメータのテンプレート引数は、次のいずれかになります。
整数型または列挙型の整数定数式。または非タイプのテンプレート パラメータの名前。または、関数テンプレートおよび関数テンプレート ID を含むが非静的クラス メンバーを除く、外部リンケージを持つオブジェクトまたは関数のアドレス。名前が関数または配列を参照する場合、& はオプションです。対応するテンプレート パラメータが参照の場合。または、5.3.1 で説明されているように表現されたメンバーへのポインター。