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

Joã*_*ulo 7 c++ templates template-specialization

我有这种情况:

#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>>();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试专门针对的模板std::vector<T>,但出现此错误:

error: too many template-parameter-lists

std::vector<T> f<std::vector<T>>() {
Run Code Online (Sandbox Code Playgroud)

我该如何专攻std::vector<T>

Qui*_*mby 10

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

template<typename T>
std::vector<T> f() {
    return { T() };
}
Run Code Online (Sandbox Code Playgroud)

这会使函数名称超载,f并且两个模板是独立的。但是通过拥有这两个重载,几乎所有的调用都会变得f模棱两可,包括您的例子main()

编辑:

如果您也删除了template<>对类部分专业化无效的行,则clang会生成更多有用的错误消息:

错误:f<std::vector<T,std::allocator<_Tp1> > >不允许非类,非变量的部分专业化

std::vector<T> f<std::vector<T>>() {
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 6

如果问题是X,解决方案是Y,则通常对功能模板进行专业化处理是Z。这时无论如何都可以进行专业化处理。您不能部分专门化功能模板,而只能重载它们。

解决方案是使用帮助器。您可以专门设计一个类模板来完成这项工作。同时,功能模板仅转发给它。

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(); }
Run Code Online (Sandbox Code Playgroud)