Значения по умолчанию для аргументов шаблона не должны повторяться в определениях.Например:
template<typename N>
struct S {
template<typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
S(T);
};
template<typename N>
template<typename T, typename>
S<N>::S(T) { }
Неверный способ использования SFINAE: EnableIfArithmetic
должен зависеть от некоторого выведенного типа (в том же шаблоне).Пожалуйста, обратитесь к этот вопрос .Например:
template<typename T = N, typename = EnableIfArithmetic<T>>
S() { }
В противном случае произойдет серьезный сбой:
ошибка: нет типа с именем 'type' в 'struct std :: enable_if'
Если вы хотите отключить конструктор по умолчанию для некоторых типов N
, вы также можете использовать static_assert
внутри конструктора.Тем не менее, это не будет СФИНА дружественным.
template<typename N>
struct S1 {
public:
template<typename T = N, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
S1() { }
};
template<typename N>
struct S2 {
public:
S2() { static_assert(std::is_arithmetic_v<N>); }
};
static_assert(std::is_default_constructible_v<S1<int>>);
static_assert(!std::is_default_constructible_v<S1<void>>);
static_assert(std::is_default_constructible_v<S2<int>>);
static_assert(std::is_default_constructible_v<S2<void>>);