接受模板类的模板函数

时间:2018-12-30 15:07:03

标签: c++ templates

我有一些聚集器类,应该聚集在一系列变量上,例如:

template<class T>
class Min{
public:
    T val=0;
    void aggregate(T val_){
        if(val_ < val){
            val = val_;
        }
};

现在,我想拥有一个将两个聚合器合并在一起的合并功能。它将接受2个聚合器(例如Min)及其类型。

template<class Agg, class T>
Agg<T> merge(Agg<T> agg1, Agg<T> agg2);

我想为每个聚合器提供模板专用化,但为内部聚合器类型提供抽象化。但是我找不到它的语法。例如,

template <> // specialization for Agg
template <class T> // abstraction for Agg's type
Min<T> merge<Min<T>>(Min<T> agg1, Min<T> agg2){...}

产生错误

error: too many template-parameter-lists
Min<T> merge<Min<T>>(Min<T> agg1, Min<T> agg2){...}
       ^~~~~~~~~~~~~

那么正确的语法是什么?

1 个答案:

答案 0 :(得分:1)

请注意,与原始代码不同,您必须在此处使用模板模板语法。

template<template<class> class Agg, class T>
Agg<T> merge(Agg<T> agg1, Agg<T> agg2);

但是,考虑到此答案的其余部分,这并不是真正需要的。

对于其余的问题,模板类允许部分专业化,但模板函数不允许部分专业化。对于您的函数,应使用重载。

template <class T> // abstraction for Agg's type
Min<T> merge(Min<T> agg1, Min<T> agg2) {...}