Я пытаюсь определить указатель на нестатическую функцию-член и передать указатель вместе с объектом класса в функцию шаблона, которая снова отправит функцию-член для операции структуры шаблона. Это продолжает давать мне ошибки несоответствия типов. Пожалуйста помоги!
Уточнение: ‘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;
}
У вас несоответствие типов:
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
связанный функтор.