我想通过将其他几个函数加在一起来创建“总计”函数。这可以在编译时完成,因此我认为递归可变参数函数模板将是一个很好的解决方案。到目前为止,我的代码:
int One(){return 1;}
int Two(){return 2;}
int Three(){return 3;}
using func_t = int(void);
//Base case
template <func_t F>
int Total() {
return F();
}
template <func_t F, func_t... Fs>
int Total() {
return F() + Total<Fs...>();
}
int main(int argc, char *argv[])
{
cout << Total<One, Two, Three>() << endl;
return 0;
}
但是,我得到MSVC编译器错误C2668:'Total':对重载函数的模棱两可的调用;可以是int Total<int Three(void),>(void)
或int Total<int Three(void)>(void)
我不明白为什么编译器为我的函数模板有两个相似的候选者,唯一的区别是其中一个有一个额外的逗号。
答案 0 :(得分:2)
您的基本案例声明不正确,导致编译器无法区分对基本案例的调用和对递归基础的调用。
如果将基本情况设为模板的空列表,则不再存在歧义。
template <class none = void>
int Total() {
return 0;
}