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

时间:2019-05-20 13:33:17

标签: 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>>();
}

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

error: too many template-parameter-lists

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

如何专门研究std::vector<T>

2 个答案:

答案 0 :(得分:10)

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

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>>() {

答案 1 :(得分: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(); }