Это потому, что условие остановки не является шаблоном функции, поэтому при вызове count_int<Tn...>();
с пустым Tn
не шаблонная функция не найдена.
Если вы попытаетесь изменить условие остановки на шаблон:
template <typename...>
size_t count_int() { return 0; }
Вы получите сообщение об ошибке, поскольку неоднозначно, какую функцию вы вызываете, когда у вас do есть параметры в пакете параметров.
Вы можете решить эту проблему путем переадресации вызова в шаблонный класс и вообще избежать рекурсии. Должно работать что-то вроде следующего (хотя мне пока не удалось это сделать)
template <typename T, typename... Tn>
struct int_counter {
enum { value = is_integer<T>::value + int_counter<Tn...>::value; }
};
template <>
struct int_counter<> {
enum { value = 0; }
};
template <typename... Tn>
size_t count_int() {
return int_counter<Tn>::value;
}