递归模板 class 定义的基本案例要求
requirements on base cases for recursive template class definitions
对于我提出的问题 ,我得到了使用这样的通用模式来解决我的问题的建议:
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... >
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以我的假设是错误的。这实际上是如何工作的?我的适应需要进行哪些正确的更改?
你忘记了正确的专业化法术:
template <class V>
class C<V>
// ^^^^ you missed this
这里有两个错误:
一、专业化不正确:
template <class V>
class C
{
//...
};
应该是:
template <class V>
class C<V>
{
//...
};
二、不正确的using
声明:
using C<Args...>::f;
应该是:
using C<V, Args...>::f;
对于我提出的问题
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... >
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以我的假设是错误的。这实际上是如何工作的?我的适应需要进行哪些正确的更改?
你忘记了正确的专业化法术:
template <class V>
class C<V>
// ^^^^ you missed this
这里有两个错误: 一、专业化不正确:
template <class V>
class C
{
//...
};
应该是:
template <class V>
class C<V>
{
//...
};
二、不正确的using
声明:
using C<Args...>::f;
应该是:
using C<V, Args...>::f;