2015-09-25 4 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! Только V и n. Вы имеете в виду просто ввести два соответствующих параметра напрямую:

template <typename V, size_t n> 
struct is_std_array<std::array<V, n>> : public true_type {}; 
+0

Похоже, это работает. У меня создалось впечатление, что, объявив ложную версию is_std_array только с T, он будет жаловаться на введение T и n в истинную версию. – Frank

+1

@Frank Вы объявили версию 'false' с * типом * (' T'), и вы специализируетесь на другом * типе * ('std :: array '). Здесь нет шаблонов шаблонов. – Barry

+0

Ах, я понял. Большое спасибо! – Frank

Смежные вопросы