![](/img/trans.png)
[英]Partial specialization of type parameter in template class with type & template template parameters
[英]Alias template, partial specialization and the invalid parameter type void
考虑以下代码:
template<typename F>
struct S;
template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };
template<typename... Args>
using Alias = S<void(Args...)>;
int main() {
S<void(int)> s;
Alias<int> alias;
}
正如预期的那样,它运行良好,并且涉及S
的行和涉及Alias
的行都在Alias
定义了相同的类型S<void(int)>
。
现在,请考虑以下更改:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
我希望它可以编译,原因与上述原因相似。
不用说,由于涉及Alias
的行,它无法编译,相反,我得到了错误:
代替“使用Alias = S [with Args = {void}]的模板”
[...]
错误:参数类型无效'void'
问题很简单:我在这里错过了什么?
在[dcl.fct]中,重点是:
由不相关类型为
void
的单个未命名参数组成的参数列表等效于空参数列表。 除这种特殊情况外,参数不得具有cvvoid
类型。
在这种情况下, Args...
是一个依赖类型包,因此那里不允许void
。 在[temp.deduct]的注释中重复了这个想法:
[注意:类型推断可能由于以下原因而失败:
— [...]
—尝试创建一个函数类型,其中参数的类型为void
,或者返回类型为函数类型或数组类型。
— [...]
—尾注]
需要注意的是S<void(void)>
编译自void(void)
非依赖性和等同于void()
这样Ret(Args...)
永远不会推导出有void
的参数列表-它推导与Args...
空。
至少有一个简单的解决方法,您可以只编写Alias<>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.