Я не привык к шаблонам C ++, и у меня возникла проблема с использованием библиотек, созданных с помощью шаблонов.
Это математические библиотеки, включенные в Численные методы в C 3-м издании, и у меня возникла проблемас использованием методов.
Ниже приведена функция, которую я пытаюсь использовать:
// roots.h
//...
template <class T>
// Doub is a defined type that is equal to double
Doub rtbis(T &func, const Doub x1, const Doub x2, const Doub xacc) {
const Int JMAX=50;
Doub dx,xmid,rtb;
Doub f=func(x1);
Doub fmid=func(x2);
if (f*fmid >= 0.0) throw("Root must be bracketed for bisection in rtbis");
rtb = f < 0.0 ? (dx=x2-x1,x1) : (dx=x1-x2,x2);
for (Int j=0;j<JMAX;j++) {
fmid=func(xmid=rtb+(dx *= 0.5));
if (fmid <= 0.0) rtb=xmid;
if (abs(dx) < xacc || fmid == 0.0) return rtb;
}
throw("Too many bisections in rtbis");
}
//...
И с этим в main.cpp я попытался вызвать
// main.cpp
#include "nr3.h"
#include "roots.h"
#include "bessel.h"
int main() {
Doub (Bessjy::*fptr) (Doub) = &Bessjy::j0;
Doub root = 0;
root = rtbis<double (Bessjy::*)(double)>(fptr,1.0,10.0,0.000001);
std::cout << root << std::endl;
}
Я использовал g ++ для компиляции, и сообщение об ошибке гласило:
error: called object type 'double (Bessjy::*)(double)' is not a function or function pointer
Doub f=func(x1);
note: in instantiation of function template specialization
'rtbis<double (Bessjy::*)(double)>' requested here
root = rtbis<double (Bessjy::*)(double)'>(fptr,1.0,10.0,0.000001);
Я изменил код, как сказал мне компилятор, но все равно он повторяет то же сообщение об ошибке.
Я не понимаю, как это решить.Конечно, я упускаю важный синтаксис.