2016-11-15 10 views
2

template<typename T1, typename T2>からtemplate<typename T1, int i>までのクラスの特殊化がサポートされないのはなぜですか?例えばテンプレート<typename T1、typename T2>からテンプレート<typename T1、int i>へのクラス特殊化がサポートされない理由

template<typename T1, typename T2> 
struct B{}; 

template<typename T1> 
struct B<T1, T1>{}; //ok 

template<typename T1> 
struct B<T1, int>{}; //ok 

template<typename T1,int i> 
struct B<T1,i>{}; //error: expected a type, got 'i' 

template<typename T1,constexpr int i> 
struct B<T1,i>{}; //error: expected a type, got 'i' 
+3

ないことを専門化... – Brian

+6

'i'は型ではないので? –

+0

ユーティリティがほとんどなく、複雑さが増すためです。 –

答えて

6

あなたの主なテンプレートは型パラメータを期待しますが、iが、それは非型引数で、タイプではありません。 はタイプです。

あなたは何とかそれらをバインドするstd::integral_constantを使用することができます。

template<typename T1, int i> 
struct B<T1, std::integral_constant<int, i>>{}; 

それはまったく同じものではありませんが、宣言を使用しては、それを回避するのに役立ちます。

template<typename T1, int i> 
using BT = struct B<T1, std::integral_constant<int, i>>; 
関連する問題