So I have a class that takes two template parameters, one is the type, one is the type of the function used, it has a reduce function to apply this function repeatedly to the array. However, I'm getting a compilation error.
function_template_test.cpp: In instantiation of 'class _C<int, int(int, int)>':
function_template_test.cpp:36:33:   required from here
function_template_test.cpp:11:17: error: field '_C<int, int(int, int)>::op' invalidly declared function type
  BinaryOperator op;
Here is my code. I have a class and the driver code down below in the main method.
#include<iostream>
template<typename _T>
_T addition(_T x,_T y)
{
    return x+y;
}
template<typename _T,typename BinaryOperator>
class _C
{
private:
    BinaryOperator op;
public:
    _C(BinaryOperator op)
    {
        this->op=op;
    }
    _T reduce(_T*begin,_T*end)
    {
        _T _t_=*begin;
        ++begin;
        while(begin!=end)
        {
            _t_=this->op(_t_,*begin);
            ++begin;
        }
        return _t_;
    }
    _T operator()(_T*begin,_T*end)
    {
        return this->reduce(begin,end);
    }
};
int main(int argl,char**argv)
{
    int arr[]={1,4,5,2,9,3,6,8,7};
    _C<int,decltype(addition<int>)>_c_=_C<int,decltype(addition<int>)>(addition<int>);
    std::cout<<_c_(arr,arr+9)<<std::endl;
    return 0;
}
 
     
    