如果Rest ...为空,template <typename T>是否与template <typename T,typename ... Rest>相同?

时间:2019-12-12 13:50:15

标签: c++ templates language-lawyer variadic-templates

我正在尝试在CRTP类中创建“转换副本构造函数”,如下所示: 模板 struct 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;

}

该代码永远不会使用gcc版本进行编译,而不会使用其他编译器进行编译。他们由于模板参数过多而拒绝了它:

<source>:11:21: error: too many template arguments for class template 'Child'

    Base(const Base<DerivedType<T2, Rest2...>>& other)  {

很显然,Rest2...的大小为0,所以我希望它与Child<T2>匹配。

解决方法是从Base构造函数的定义中删除模板参数T2。但是,我很好奇哪个编译器在这里?

实时示例here

0 个答案:

没有答案