Вы просто путаете имена типов и имена не типов.То, что вы хотите, просто не работает.
Вы можете , вероятно, использовать переменные нетипичные шаблоны в функциях, но не в качестве (не шаблонных) аргументов:
template <int N, int... Rest>
int max()
{
int tmp = max<Rest...>();
return N < tmp ? tmp : N;
}
std::cout << max<3, 1, 4, 2, 5, 0>() << std::endl;
… хотя я не проверял это, и я не уверен, как это должно работать, учитывая, что вам нужно иметь частичную специализацию в качестве базового варианта.Вы можете решить эту проблему, отправив частично специализированную структуру:
template <int N, int... Rest>
struct max_t {
static int const value = max_t<Rest...>::value > N ? max_t<Rest...>::value : N;
};
template <int N>
struct max_t<N> {
static int const value = N;
};
template <int... NS>
int max()
{
return max_t<NS...>::value;
}
Это будет работать.