我正在尝试定义一个可以与 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 {};
但我从 clang 那里收到以下警告:
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”不可扣除?我该如何解决?
最佳答案
你的 specializing 语法是错误的:
template <template <typename, size_t> class T, typename V, size_t n>
您在这里引入了三个 模板参数:第一个是名为T
的模板template 参数,它有两个参数:类型和 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 {};
关于c++ - std::array 的类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787702/