我试图定义一个指向非静态成员函数的指针,并将指针和类对象一起传递给模板函数,该模板函数将再次发送模板结构操作的成员函数。它一直给我类型不匹配错误。请帮忙!
澄清:' vecfunc'是PTSolver类的非静态成员函数。它需要输入矢量和输出矢量。我想将一个指向这个vecfunc的指针作为参数传递给模板函数" newt',它也将传递给模板结构操作' fmin()。'在整个过程中,我需要提供有关PTSolver对象的信息' ptsolver'因为它不是静态成员函数。但我无法做到这一点......
template <class T>
struct NRfmin {
VecDoub fvec;
T &func;
int n;
NRfmin(T &funcc) : func(funcc) {}
double operator() (VecDoub_I &x) {
n=x.size();
double sum=0.0;
fvec=func(x);
for (int i = 0;i<n;i++) sum += SQR(fvec[i]);
return 0.5*sum;
}
};
template <class T>
void newt(VecDoub_IO &x, bool &check, T &vecfunc, PTSolver &obj){
NRfmin<T> fmin(obj.*vecfunc);
VecDoub &fvec=fmin.fvec;
f=fmin(x);
...
}
class PTSolver {
public:
PTSolver() = default;
virtual ~PTSolver() = default;
void solve();
VecDoub vecfunc(VecDoub_I);
};
VecDoub PTSolver::vecfunc(VecDoub_I x) {
int n=x.size();
VecDoub results(n);
for (int i=0;i<n;i++) {
results[i]=2.0*x[i];
}
return results;
}
int main() {
VecDoub initGuess(2);
initGuess[0]=4.4;
initGuess[1]=5.5;
bool check;
//function<VecDoub(PTSolver*, VecDoub_I)> Func=&PTSolver::vecfunc;
typedef VecDoub (PTSolver::*PMemFnc)(VecDoub_I x);
PMemFnc Func;
PTSolver ptsolver;
newt<PMemFnc>(initGuess, check, Func, ptsolver);
return 0;
}
答案 0 :(得分:0)
您的类型不匹配:
template <class T>
struct NRfmin {
NRfmin(T &funcc) : func(funcc) {}
};
template <class T>
void newt(VecDoub_IO &x, bool &check, T &vecfunc, PTSolver &obj){
NRfmin<T> fmin(obj.*vecfunc);
..
};
在这两种情况下T
都是指向成员函数的指针,但是您正在使用绝对不是fmin
的东西构建T&
(它甚至不是有效的表达式) 。要么只是转发指针,在这种情况下:
NRfmin<T> fmin(vecfunc);
或者您想传递NRfmin
绑定仿函数。