加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 变体模板,参数包及其在参数列表中的歧义

发布时间:2020-12-16 04:59:34 所属栏目:百科 来源:网络整理
导读:在这个问题中,我将参考 my previous question. 在这个问题上,我发现以下内容无效: templatetypename T,typename... A,typename Sclass C { }; 这是因为: [It is not valid code] for class templates because their arguments must always be specified,wh
在这个问题中,我将参考 my previous question.

在这个问题上,我发现以下内容无效:

template<typename T,typename... A,typename S>
class C { };

这是因为:

[It is not valid code] for class templates because their arguments must always be specified,which will always result in an ambiguity unless the parameter pack is at the end and slurps up any remaining template parameters.

当然,这是有道理的.

然后,作为替代方法,提出了以下涉及专业化的方法:

template<typename F,typename S>
class C;

template<typename T,typename S>
class C<T(A...),S> { };

实际上,这似乎是有效的,所以感谢提出它的那个.

无论如何,我不明白为什么这是有效的代码,而前一个没有.
如果以前的解决方案同样含糊不清呢?编译器为什么和如何解决这种歧义?
根据以前的问题(见这个问题开始的链接),在我看来,仍然是可变的部分应该扼杀任何参数到最后,因此这个代码也不应该是有效的.
我当然错了,但我的推理究竟是怎么了?

解决方法

在类模板中,预期模板参数列表C a,b,c,d,e,f>需要匹配
template<typename T,typename S>

其中… A只是浮动在参数列表中.

但在专业化中,需要匹配的不是模板列表,而是模式:

C<T(A...),S>

这是容易的,因为A …被分隔.

因此,在模板专业化中,参数列表只是一个符号的清单,一些标量和一些参数包,将以模式显示.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读