c – Variadic模板,编译器道歉

之前我曾问过类似的问题,明白我可以通过部分专业化来实现它.但是为了理解可变参数模板的基础知识我修改了这样的代码.

template<typename T,typename... args>
struct counter{
static const int value= 1+ counter<args...>::value;
};

template<typename T>
struct counter<T>{
static const int value = 0;
};

错误:“抱歉,未实现:无法将’args …’扩展为固定长度的参数列表”

我知道这是错误,并已在gcc 4.7.0中修复

所以要解决这一切,我们必须使用技巧或其他,这是部分专门模板.

template<typename... Args> struct counter;

template<>
struct counter<> {
static const int value = 0;
};

template<typename T,typename... Args>
struct counter<T,Args...> {
static const int value = 1 + counter<Args...>::value;
};

实际问题:所以我真的想知道部分特化在这里做了什么特殊效果,以便代码可以工作,或者我应该问部分特化如何解决问题? (为什么第二个版本没有碰到这个bug?).任何有动机问题和例子的解释都会非常有帮助.

解决方法

第二个版本避免了这个错误,因为主模板被声明为模板< typename ...>,即它是可变参数.错误的关键在于错误消息:“抱歉,未实现:无法将’args …’扩展为固定长度的参数列表”(强调我的).

因此,计数器< Args ...> :: value将适用于第二种情况,因为计数器被定制为接受任意数量的参数.但是,在主模板声明为模板< typename T,typename ... args>的第一种情况下,编译器必须将args分成固定长度部分(T)和可变参数部分(新args).据推测,这是您的GCC版本中未实现的功能.

我没有理由相信无论什么机器允许< T,Args ...>第二种情况的专门化以匹配< typename ...>主模板可以重复用于固定长度扩展.

(最后,由于CCC特征的支持被GCC标记为“实验性”,你真的不能期望什么会起作用,什么不起作用,更不用说为什么和如何.这些问题只能合理地GCC开发人员在他们的邮件列表中回答,而不是我们.我们不介意读者.)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...