2016-11-15 57 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>>; 
相关问题