Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是模板<;typename T>;与模板相同<;typename T,typename。。。休息>;如果休息。。。是空的吗?_C++_Templates_Language Lawyer_Variadic Templates - Fatal编程技术网

C++ 是模板<;typename T>;与模板相同<;typename T,typename。。。休息>;如果休息。。。是空的吗?

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(

我试图在CRTP类中创建一个“转换副本构造函数”,如下所示: 模板 结构基础

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的代码段相同。