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

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

概述在这个问题中,我将参考 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 在这个问题中,我将参考 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 …被分隔.

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

总结

以上是内存溢出为你收集整理的c – 变体模板,参数包及其在参数列表中的歧义全部内容,希望文章能够帮你解决c – 变体模板,参数包及其在参数列表中的歧义所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存