Ваш основной шаблон и ваша специализация должны иметь одинаковое количество параметров шаблона. На данный момент у вашего основного учебного заведения есть 1:
template<class T>
struct is_vector_enum
, а у вашей специализации 2:
template<class T, class std::enable_if<std::is_enum<T>::value>::type* = nullptr>
struct is_vector_enum<std::vector<T>>
Типичный способ сделать это в C ++ 17 - предоставить фиктивного второго параметр шаблона для основного, который по умолчанию равен void
, чтобы затем позволить вам выполнить SFINAE во втором параметре:
template <class T, class Enable=void>
struct is_vector_enum { /* ... */ };
template <class T>
struct is_vector_enum<std::vector<T>, std::enable_if_t<std::is_enum_v<T>>> { /* ... */ };
Другой способ сделать это полностью:
template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
std::true_type impl(std::vector<T> const&);
template <typename T>
std::false_type impl(T const&);
template <typename U>
using is_vector_enum = decltype(impl(std::declval<T>()));
Обратите внимание, что функции impl
здесь не определены и не предназначены для вызова.