我正在尝试定义一个可以与static_assert
一起使用的类型特征,以控制仅使用s td::array<T,n>
实例化我的模板类之一。这是我的尝试:
template <typename T>
struct is_std_array : public false_type {};
template <template <typename, size_t> class T, typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};
但是我从c得到以下警告:
warning: class template partial specialization contains a template parameter
that cannot be deduced; this partial specialization will never be used
non-deductible template parameter 'T'
为什么“T”不可扣除?我该如何解决?
最佳答案
您关于特化的语法是错误的:
template <template <typename, size_t> class T, typename V, size_t n>
您将在此处介绍三个模板参数:第一个是名为
T
的模板模板参数,该参数带有两个参数:type和size_t
。由于在您的特化子句中没有引用T
,因此:struct is_std_array<std::array<V, n>> // <== no T
这是一个非推论的上下文。考虑一下等效编写的函数:
template <template <typename, size_t> class T, typename V, size_t n>
void foo(std::array<V, n> );
同样,此处的
T
是非推论上下文,因此必须明确指定。但是,您实际上根本不需要T
!只是V
和n
。您的意思是简单地直接引入两个相关参数:template <typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};