C++ 是模板<;typename T>;与模板相同<;typename T,typename。。。休息>;如果休息。。。是空的吗?
我试图在CRTP类中创建一个“转换副本构造函数”,如下所示: 模板 结构基础C++ 是模板<;typename T>;与模板相同<;typename T,typename。。。休息>;如果休息。。。是空的吗?,c++,templates,language-lawyer,variadic-templates,C++,Templates,Language Lawyer,Variadic Templates,我试图在CRTP类中创建一个“转换副本构造函数”,如下所示: 模板 结构基础 template<typename Derived> struct Base; template<template<typename, typename...> class DerivedType, typename T, typename... Rest > struct Base<DerivedType<T, Rest...>> { Base(
template<typename Derived>
struct Base;
template<template<typename, typename...> class DerivedType, typename T, typename... Rest >
struct Base<DerivedType<T, Rest...>> {
Base() = default;
template<typename T2, typename... Rest2>
Base(const Base<DerivedType<T2, Rest2...>>& other) {
}
};
template<typename T>
struct Child : Base<Child<T>> {
using MyBase = Base<Child<T>>;
Child() = default;
template<typename T2>
Child(const Child<T2>& other) : MyBase(other) {}
};
int main() {
Child<int> cti;
Child<float> ctf = cti;
}
模板
结构基础;
模板
结构基{
Base()=默认值;
模板
基础(施工基础和其他){
}
};
模板
结构子对象:基{
使用MyBase=Base;
Child()=默认值;
模板
Child(const Child&other):MyBase(other){}
};
int main(){
儿童cti;
子ctf=cti;
}
代码从不使用gcc版本编译,但不使用其他编译器编译。由于模板参数太多,他们拒绝了它:
<source>:11:21: error: too many template arguments for class template 'Child'
Base(const Base<DerivedType<T2, Rest2...>>& other) {
:11:21:错误:类模板“Child”的模板参数太多
基础(施工基础和其他){
显然,Rest2…
的大小是0,因此我希望它与Child
匹配
解决方法是从基构造函数的定义中删除模板参数T2
实例。有一条规则,如果唯一有效(隐式或显式),则会导致程序格式错误变量模板的专门化必须有一个空包。但我还不能确定这是否是问题所在。似乎也没有使用GCC编译@Ayxan:它确实编译,请参阅上面的链接。您的代码缺少主声明(可能是复制/粘贴问题).Ahh,抱歉:似乎我忘了将其包含在示例中:/n它可能与[P0522][相关。只有GCC实现了此C++17功能。这会产生一个非常类似的问题。如果从参数列表中删除
First
或Rest…
,它将编译。其行为与op的代码段相同。