c – Variadic模板,编译器道歉

c – Variadic模板,编译器道歉,第1张

概述之前我曾问过类似的问题,明白我可以通过部分专业化来实现它.但是为了理解可变参数模板的基础知识我修改了这样的代码. template<typename T, typename... args>struct counter{static const int value= 1+ counter<args...>::value;};template<typename T>struct coun 之前我曾问过类似的问题,明白我可以通过部分专业化来实现它.但是为了理解可变参数模板的基础知识我修改了这样的代码.

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 – Variadic模板,编译器道歉全部内容,希望文章能够帮你解决c – Variadic模板,编译器道歉所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存