我不习惯C ++模板,使用模板制作的库时遇到问题。
这些是C 3rd Edition的“数值方法”中包含的与数学相关的库,我在使用这些方法时遇到了问题。
以下是我要使用的功能:
// 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);
我按照编译器的要求修改了代码,但仍然会重复相同的错误消息。
我不知道如何解决。 当然,我错过了重要的语法问题。
答案 0 :(得分:2)
(根据评论中的讨论将其发布完成,以供其他人查找是否有相似的问题)。
由于Bessjy::j0()
是静态成员函数,如问题its type is the same as if it were an ordinary function下的注释所述。您可以像其他任何普通函数一样,将其作为参数传递给rtbis<>()
。这是一个示例:
#include <iostream>
using Int = int ;
using Doub = double ;
class Bessjy
{
public:
static Doub j0(Doub x1) { return x1*x1 + 60.0 ; }
} ;
template <class T>
Doub rtbis(const T& func, const Doub x1, const Doub x2, const Doub xacc) {
return func(x1) ;
}
int main()
{
const auto root = rtbis(Bessjy::j0,1.0,10.0,0.000001);
std::cout << root << std::endl;
return 0 ;
}