Fra*_*ank 3 c++ templates c++11
我试图定义一个类型特征,我可以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 {};
Run Code Online (Sandbox Code Playgroud)
但我从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'
Run Code Online (Sandbox Code Playgroud)
为什么'T'不能扣除?我该如何解决这个问题?
你的专业化语法是错误的:
template <template <typename, size_t> class T, typename V, size_t n>
Run Code Online (Sandbox Code Playgroud)
你在这里引入了三个模板参数:第一个是名为的模板模板参数T,它带有两个参数:一个类型和一个size_t.由于T未在专业化条款中的任何位置引用:
struct is_std_array<std::array<V, n>> // <== no T
Run Code Online (Sandbox Code Playgroud)
这是一个非演绎的背景.想想等效编写的函数:
template <template <typename, size_t> class T, typename V, size_t n>
void foo(std::array<V, n> );
Run Code Online (Sandbox Code Playgroud)
这里也是T一个非推断的上下文,因此必须明确指定.但是,你根本不需要T!只是V和n.你的意思是直接简单介绍两个相关参数:
template <typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |