专门化模板数据类型的模板

Specialize template of templated data type

本文关键字:数据类型 专门化      更新时间:2023-10-16

我有这种情况:

#include <vector>
template<typename T>
T f() { return T(); }
template<>
template<typename T>
std::vector<T> f<std::vector<T>>() {
    return { T() };
}
int main(){
    f<std::vector<int>>();
}

我正在尝试专门针对std::vector<T>的模板,但是我遇到了此错误:

error: too many template-parameter-lists
std::vector<T> f<std::vector<T>>() {

我如何专门用于std::vector<T>

没有部分专业的功能模板。您正在做的是创建一个新模板,因此正确的语法将是:

template<typename T>
std::vector<T> f() {
    return { T() };
}

这将函数名称f过载,并且两个模板是独立的。但是,通过两个过载,几乎所有对f的电话都模棱两可,包括您的main()中的一个示例。

编辑:

您是否删除了template<>行,这对于类别的部分专业化也是无效的,那么Clang会生成更多有用的错误消息:

错误:不允许使用非类别的非级别部分专业f<std::vector<T,std::allocator<_Tp1> > >

std::vector<T> f<std::vector<T>>() {

如果问题是x,而解决方案是y,则通常对功能模板的专业化为z。这是可以进行专业化的时候。您不能部分专业化功能模板,只能超载它们。

这里的解决方案是使用助手。您 can 专业的类模板将完成工作。同时,功能模板仅向其转到其。

namespace detail {
    template<typename T>
    struct f {
        static T work() { return T(); }
    };
    template<typename T>
    struct f<std::vector<T>> {
        static std::vector<T> work() { return {T()}; }
    };
}
template<typename T>
T f() { return detail::f<T>::work(); }