我的情况如下,我有两个不同的二分函数,将在我的代码中的某个点调用。基本上一些函数调用Bisection2,这个函数调用传递的函数或者它将函数指针传递给Bisection函数。
我在标题中
std::vector<double> F();
double F1(double m1, double m2);
double F2(double m1, double m2);
typedef double (MyClass::*MyClassFn)(double,double);
double Bisection(MyClassFn fEval,double min, double max,std::vector<double> args);
bool Bisection2(MyClassFn fEval1,MyClassFn fEval2,double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,std::vector<double> args);
我的二分函数看起来像这样。我没有包含所有代码,因为没有必要。
double MyClass::F1(double m1, double m2) {
m_m1 = m1;
m_m2 = m2;
F();
return m_my;
}
double MyClass::F2(double m1, double m2) {
m_m1 = m1;
m_m2 = m2;
F();
return m_mx;
}
double MyClass::Bisection(MyClass fEval,double min, double max,std::vector<double> args)
{
// Setting a lot of stuff here, including auxiliary and leftvalue...
MyClass *pObj = new MyClass(-1);
leftvalue = pObj->*fEval(auxiliary, left);
ightvalue = pObj->*fEval(auxiliary, right);
// Comparing and setting values here etc.
}
bool MyClass::Bisection2(MyClassFn fEval1,MyClassFn fEval2,double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,std::vector<double> args)
{
// Setting some values here but these have nothing to do with the problem.
double yl;
double leftvalue, rightvalue, middlevalue;
MyClass *pObj = new MyClass(-1);
// Setting some values here but these have nothing to do with the problem.
std::vector <double> arg;
// pushing some values
yl = Bisection(fEval2,ymin,ymax,arg); // Here is the first way how I need to pass fEval2 to Bisection function.
arg.clear();
if(isnan(yl))
{
return M_NAN;
}
leftvalue = pObj->fEval1(xl, yl); // And here is the second way how I need to use fEval1.
//.....
}
然后我基本上有一个叫做
的函数`Bisection2(F1,F2,m_m2,0.0,0.0,m_max2,&amp; m_mu1,&amp; m_mu2,args);
此次Bisection2(...)调用可能不正确,因为自上次工作以来我已经更改了很多功能。上次我基本上直接在函数内部调用了F1和F2函数指针,而不是fEval,但我很确定它是不正确的,毕竟甚至认为它似乎以某种方式工作。
现在leftvalue = pObj-&gt; * fEval(辅助,左);导致编译错误:
error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘fEval (...)’, e.g. ‘(... ->* fEval) (...)’
我试图从这里看到帮助http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2 并且还检查了这些论坛中可能存在的不同问题,但仍然无法弄清楚我做错了什么。
谢谢。
答案 0 :(得分:4)
正如错误消息所示,您需要括号。这是因为函数调用的优先级高于->*
运算符:
leftvalue = (pObj->*fEval)(auxilary, left);
^ ^
此外,你几乎肯定不应该在这里使用new
;您可以使用自动存储来修复内存泄漏:
MyClass obj(-1);
leftvalue = (obj.*fEval)(auxiliary, left);
答案 1 :(得分:0)
这只是一个优先事项:
不要执行pObj->*fEval(aux, left)
,而只需执行(pObj->*fEval)(aux, left)