К вопросу я спросил here, я получил предложение использовать общую картину, как это решить мою проблему:требования базовых случаев для рекурсивного шаблонного класса определений
template <class... T>
class C;
template <>
class C<>
{
public:
void f() {}
};
template <class T, class... Args>
class C<T, Args...> : public C<Args...>
{
public:
using C<Args...>::f;
void f(const T& t) { /*stuff*/ }
};
Теперь, я не совсем понимаю, почему этот шаблон должен быть таким, поэтому я попытался адаптировать его по гипотезе, которую я имел о том, как это работает. В приспособлении я хотел закончить рекурсию в базовом случае с аргументами 1, а не 0 шаблонов, так что я изменил фрагмент кода следующим образом:
template <class V, class... >
class C;
template <class V>
class C
{
public:
void f() {}
};
template <class V, class T, class... Args>
class C<V, T, Args...> : public C<V, Args...>
{
public:
using C<Args...>::f;
void f(const T& t) { /*stuff*/ }
};
Здесь V
должен продолжать получать прошло, пока Args...
пуст, затем
template <class V>
class C
{
public:
void f() {}
};
предполагается выбрать. Однако это вызывает ошибку:
error: too few template parameters in template redeclaration
template <class V>
^~~~~~~~~~~~~~~~~~
note: previous template declaration is here
template <class V, class... >
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Так что моя гипотеза была неправильной. Как это работает и какими будут правильные изменения для моей адаптации?
спасибо, почему '' требуется 'шаблон класса C ' хотя? Afteral есть только один параметр шаблона. –
Это синтаксис специализации, 'C' - это базовый регистр, а' C '- это случай специализации для одного параметра шаблона. –
xinaiz