递归模板类别定义的基本案例要求
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
{
//...
};
应该是:
template <class V>
class C<V>
{
//...
};
第二,不正确的using
声明:
using C<Args...>::f;
应该是:
using C<V, Args...>::f;
您正确地忘记了咒语:
template <class V>
class C<V>
// ^^^^ you missed this
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 自定义分配器,包括放置新案例
- 递归模板类别定义的基本案例要求
- 一个奇怪的案例...对"主要"的未定义引用