Числовые рецепты: как передать функцию в качестве аргумента функции newt в Stack Overflow

Мой вопрос связан с числовыми рецептами.
У меня есть глобальная функция, которая вычисляет вектор функций, которые будут минимизированы

VecDoub vecfunc(VecDoub_I x) {
// code is here
}

В функции класса бежать, Я попытался вызвать функцию Числовых Рецептов newt, которая читает мою функцию vecfunc как показано,

class A {
void run() {
VecDoub_IO pt;
pt.resize(2);
pt[0] = 0.5;
pt[1] = 0.5;
bool check = false;
newt<VecDoub>(pt, check, &vecfunc);
}
}

функция тритон объявлен как

template <class T>
void newt(VecDoub_IO &x, Bool &check, T &vecfunc)

Почему я получаю следующую ошибку компилятора?

error C2664: 'newt' : cannot convert parameter 3 from 'VecDoub (__cdecl *)(VecDoub_I)' to 'VecDoub &'

0

Решение

В вызове newt Вы явно указываете, что T является VecDoub(Вы указали newt<VecDoub>), но вы передаете ему адрес функции, поэтому компилятор не может преобразовать вашу функцию в VecDoub&, Если вы хотите VecDoub& в newt затем позвоните vectfunc и сохранить его во временной переменной, а затем передать эту переменную в функцию (так как в newt последний параметр является ссылкой на T) но если вам действительно нужна функция в newt тогда зачем ты пишешь newt<VecDoub>(pt, check, &vecfunc) пока ты можешь писать newt(pt, check, &vecfunc) и пусть C ++ выводит тип для вас? и кроме того, чтобы получить функции в newt не получить их по ссылке, вместо этого получить их по значению, так newt объявляется как:

template <class T>
void newt(VecDoub_IO &x, Bool &check, T vecfunc)

Так как функции обычно являются небольшими объектами или указателями, это будет работать и не уменьшать производительность

2

Другие решения

Потому что вы должны вызывать функцию и передавать возвращаемое значение в качестве параметра, а не саму функцию.

newt<const VecDoub>(pt, check, vecfunc(something) );

Я добавил const потому что ссылка должна быть постоянной, в противном случае возвращаемое значение из vecfunc не может связать это, потому что это временно.

Объяснить:

newt<VecDoub>(pt, check, &vecfunc);

пытается вызвать функцию, аналогичную

newt_VecDoub(VecDoub_IO &x, Bool &check, VecDoub &vecfunc);

Третий параметр, который вы пытаетесь передать, &vecfunc который имеет тип VecDoub (__cdecl *)(VecDoub_I)так что это, очевидно, не может работать.

1

По вопросам рекламы [email protected]