0

私の状況は次のとおりです。コードのある時点で呼び出される2つの異なる二分関数があります。基本的に、一部の関数は 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, &m_mu1, &m_mu2,args);

Bisection2(...) 呼び出しは、前回動作してから関数を大幅に変更したため、現時点では正しくない可能性があります。前回は基本的に、fEval の代わりに F1 および F2 関数ポインターを関数内で直接呼び出しましたが、どうにか機能しているように見えたとしても、間違った方法であると確信しています。

今 leftvalue = pObj->*fEval(auxiliary, left); コンパイル エラーが発生します。

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 また、これらのフォーラムでおそらく異なる解決済みの問題をチェックしましたが、それでもできます '私が間違っていることを理解することはできません。

ありがとうございました。

4

2 に答える 2

4

エラーメッセージにあるように、括弧が必要です。->*これは、関数呼び出しが演算子よりも優先されるためです。

leftvalue = (pObj->*fEval)(auxilary, left);
            ^            ^

newまた、ほぼ確実にここで使用するべきではありません。自動ストレージを使用してメモリ リークを修正できます。

MyClass obj(-1);
leftvalue = (obj.*fEval)(auxiliary, left);
于 2012-07-02T17:35:54.517 に答える
0

これは単純に優先順位の問題です: 実行する代わりに実行pObj->*fEval(aux, left)するだけです(pObj->*fEval)(aux, left)

于 2012-07-02T17:43:23.453 に答える