静态成员初始化和可变参数模板

时间:2015-11-08 21:24:12

标签: c++ templates c++11 static-members static-initialization

通过查看以下代码,我们注意到初始化名为cnt的静态数据成员非常容易:

template<typename T> struct Base { static int cnt; };
template<typename T> int Base<T>::cnt = 0;
int main() { }

无论如何,我正在与variadic_template和静态数据成员进行斗争,因为我无法使用它们。请考虑以下代码:

template<typename...> struct Base;
template<> struct Base<> { static int cnt; };
int main() { }

首先,我尝试了最明显的事情,至少是对我来说最明显的事情:

template<typename... T> int Base<T...>::cnt = 0;

它返回error: template definition of non-template ‘int Base<T>::cnt’,我立刻意识到我的尝试确实没有意义。也就是说,之后我有点疑惑,因为对我而言,这是正确的语法不再是显而易见的。

我尝试了以下方法:

template<> int Base<>::cnt = 0;
// ... and ...
template<> int Base::cnt = 0;

错误error: template definition of non-template ‘unsigned int Base<T>::cnt’error: ‘template<class ... T> struct Base’ used without template parameters

到目前为止,我已经与variadic template进行了一些工作,我不知道如何使用它们。我甚至无法弄清楚它是否可能以及正确的语法是什么。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

仅使用

Base<>

此时,template<>是一个完整的专业化,你没有专门化任何东西,所以int Base<>::cnt = 0;不再是必需的,实际上是被禁止的。

答案 1 :(得分:2)

将其初始化为:

{{1}}

LIVE DEMO