C++ 函数指针作为模板参数,类型推断失败

C++ 函数指针作为模板参数,类型推断失败,c++,templates,function-pointers,C++,Templates,Function Pointers,我试图使用函数指针作为非类型模板参数,但有时我不理解为什么它无法推断类型 这里有一个例子 template <class T, class U, class R> R sum(T a, U b) { return a + b; } template <class T, class R, R (*Func)(T, R)> R reduce(T *in, R initial, int len) { for (int i = 0; i < len; ++i)

我试图使用函数指针作为非类型模板参数,但有时我不理解为什么它无法推断类型

这里有一个例子

template <class T, class U, class R>
R sum(T a, U b) { return a + b; }

template <class T, class R, R (*Func)(T, R)>
R reduce(T *in, R initial, int len) {
    for (int i = 0; i < len; ++i)
        initial = Func(in[i], initial);
    return initial;
}

int main() {
    double data[] = {1, 2, 3, 4, 5};
    std::cout << "Sum: " << reduce<sum>(data, 0.0, 5) << "\n";
    return 0;
}
模板
R和(ta,ub){返回a+b;}
模板
R减小(T*in,R初始值,int len){
对于(int i=0;istd::cout错误是您提供了模板的部分专门化。存在“要么全部要么全无”的工作规则。因此,如果您按照以下方式更改签名:

template <class T, class R>
 R reduce(R (*Func)(T, R), T *in, R initial, int len) {

一切都编译得很好

Awww天哪,我总是忘记模板函数中不允许部分专门化!无论如何,我不允许将函数作为函数的参数传递(但我要在模板中传递)。因此我想我必须完全专门化调用。
std::cout << "Sum: " << reduce<double, double, sum>(data, 0.0, 5) << "\n";
template <class T, class R>
 R reduce(R (*Func)(T, R), T *in, R initial, int len) {
reduce(sum, data, 0.0, 5)