具有模板函数指针参数的调用函数

时间:2018-09-28 05:18:57

标签: c++ templates

我不习惯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&lt;double (Bessjy::*)(double)&gt;' requested here
root = rtbis&lt;double (Bessjy::*)(double)'&gt;(fptr,1.0,10.0,0.000001);

我按照编译器的要求修改了代码,但仍然会重复相同的错误消息。

我不知道如何解决。 当然,我错过了重要的语法问题。

1 个答案:

答案 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 ;
}

here在线试用。阅读this了解更多信息和注意事项。