2017-02-19 33 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