2017-02-19 1 views
1

К вопросу я спросил 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... > 
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

Так что моя гипотеза была неправильной. Как это работает и какими будут правильные изменения для моей адаптации?

ответ

1

Две ошибки здесь: Во-первых, неправильная специализация:

template <class V> 
class C 
{ 
    //... 
}; 

Должно быть:

template <class V> 
class C<V> 
{ 
    //... 
}; 

Во-вторых, неправильно using декларация:

using C<Args...>::f; 

Должно быть:

using C<V, Args...>::f; 
+0

спасибо, почему '' требуется 'шаблон класса C ' хотя? Afteral есть только один параметр шаблона. –

+1

Это синтаксис специализации, 'C' - это базовый регистр, а' C '- это случай специализации для одного параметра шаблона. – xinaiz

1

Вы забыли правильно пишется специализации:

template <class V> 
class C<V> 
// ^^^^ you missed this 
Смежные вопросы