具有多个参数的模板化类专业化,其中一个模板参数是模板本身

时间:2020-01-23 09:58:00

标签: c++ templates template-specialization

我认为只显示一些代码是最简单的:

template<typename T>
struct TemplateTest { //<-- generic version
    using typeGeneric = int;
};
template<>
struct TemplateTest<std::vector<int>> { //<-- specialized with specialized version of vector
    using typeVectorInt = int;
};
template<typename T>
struct TemplateTest<std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};

int main (int argc, char** argv) {
    typename TemplateTest<int>::typeGeneric var1;
    typename TemplateTest<std::vector<int>>::typeVectorInt var2;
    typename TemplateTest<std::vector<char>>::typeVectorT var3;
    return 0;
}

这工作正常且符合预期。由于我在不同的专业中使用了不同的使用名称,因此,如果在编译期间选择了非预期的专业,则会出现编译错误。 (我只是为了显示此问题而这样做的)

但是,这无法按预期进行:

template<typename Tfirst, typename Tsecond>
struct TemplateTest { //<-- generic version
    using typeGeneric = int;
};
template<typename Tfirst>
struct TemplateTest<Tfirst, std::vector<int>> { //<-- specialized with specialized version of vector
    using typeVectorInt = int;
};
template<typename Tfirst>
template<typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};

int main (int argc, char** argv) {
    typename TemplateTest<int, int>::typeGeneric var1;
    typename TemplateTest<int, std::vector<int>>::typeVectorInt var2;
    typename TemplateTest<int, std::vector<char>>::typeVectorT var3;
    return 0;
}

var3是问题。矢量专门化无法正常工作(编译器未选择),我也不知道为什么。能做到吗?如果可以,怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在以错误的语法(带有无关的模板参数列表)声明第二个专业化名称;更改为

template<typename Tfirst, typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};
相关问题