2016-11-15 53 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

因爲'我'不是一種類型? –

+0

因爲沒有什麼實用性和很多複雜性。 –

回答

6

你的主模板期望的類型參數,但i不是一個類型,它是一種非類型參數。 int是一種類型。

您可以使用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>>; 
相關問題