gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:20:48 27 4
gpt4 key购买 nike

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

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

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

最佳答案

(根据评论中的讨论张贴完成,供其他人查找是否有类似问题)。

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了解更多信息和注意事项。

关于c++ - 调用具有模板函数指针参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52548769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com