我正在尝试定义一个可以与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!只是Vn。您的意思是简单地直接引入两个相关参数:
template <typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};

07-24 09:46