2015-09-25 78 views
2

的类型特征我试图定义一个类型特征,我可以使用static_assert来控制我的一个模板类仅通过s td::array<T,n>实例化。这里是我的尝试:std :: array

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 {}; 

但我从铛收到以下警告:

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' 不计免赔?我如何解决这个问题?

+0

你能帮我使用true_type和false_type这样吗? –

回答

8

你对专业的语法是错误的:

template <template <typename, size_t> class T, typename V, size_t n> 

你介绍这里模板参数:其中第一项是模板模板参数命名T,它有两个参数:一个类型和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 {}; 
+0

看起来像这样的作品。我的印象是,仅仅用T来声明is_std_array的假版本,它会抱怨在真正的版本中引入T和n。 – Frank

+1

@Frank你使用* type *('T')声明'false'版本,并且你专注于另一个* type *('std :: array ')。这里没有模板模板。 – Barry

+0

啊 - 我明白了。非常感谢! – Frank

相关问题