Мой вопрос связан с числовыми рецептами.
У меня есть глобальная функция, которая вычисляет вектор функций, которые будут минимизированы
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 &'
В вызове 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)
Так как функции обычно являются небольшими объектами или указателями, это будет работать и не уменьшать производительность
Потому что вы должны вызывать функцию и передавать возвращаемое значение в качестве параметра, а не саму функцию.
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)
так что это, очевидно, не может работать.