我有一些聚集器类,应该聚集在一系列变量上,例如:
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){...}
^~~~~~~~~~~~~
那么正确的语法是什么?
答案 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) {...}