要我提出的问题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