Это потому, что вы не предоставили базовый вариант. Вы извлекли последний тип данных параметра шаблона переменной, а затем попытались сопоставить пустой параметр переменной функции, принимающей тип и параметр переменной. Необходимо указать «базовый случай», когда параметр переменной пуст.
using namespace std;
template <typename FirstDatatype, typename... DatatypeList>
void OutputSizes()
{
std::cout << typeid(FirstDatatype).name() << ": " << sizeof(FirstDatatype) << std::endl;
OutputSizes<DatatypeList...>();
}
template<typename... DataTypeList>
void OutputSizes() // We're called when there's no template arguments
// left in the pack
{
}
int main()
{
OutputSizes<char, int, long int>();
return 0;
}
Редактировать: Множественные нулевые перегрузки, которые я здесь показал, на самом деле работают, только когда вы берете фактические аргументы времени выполнения, тоже основанные на типах шаблонов. Если вы берете только параметры шаблона напрямую, вы должны использовать рекурсию два-один, как показано в ответе Говарда Хиннанта.