0

私の質問は数値レシピに関連しています。最小化する関数のベクトルを計算するグローバル関数があります

VecDoub vecfunc(VecDoub_I x) {
  // code is here
}

クラス関数の実行で、Numerical Recipes関数newtを呼び出そうとしました。これは、次のように関数vecfuncを読み取ります。

class A {
    void run() {
        VecDoub_IO pt;
        pt.resize(2);
        pt[0] = 0.5;
        pt[1] = 0.5;
        bool check = false;
        newt<VecDoub>(pt, check, &vecfunc);
    }
}

関数newtは次のように宣言されます

template <class T>
void newt(VecDoub_IO &x, Bool &check, T &vecfunc)

次のコンパイラエラーが発生するのはなぜですか?

error C2664: 'newt' : cannot convert parameter 3 from 'VecDoub (__cdecl *)(VecDoub_I)' to 'VecDoub &'
4

2 に答える 2

2

呼び出し時に、それが(指定した)newtであることを明示的に指定しますが、関数のアドレスをそれに渡すため、コンパイラーは関数をに変換できません。inが必要な場合は、それを呼び出して一時変数に格納し、その変数を関数に渡します(最後のパラメーターはへの参照であるため)が、本当に関数が必要な場合は、なぜ書き込みを行うことができますか? C ++はあなたのためにタイプを推測しますか?また、関数を受け取るためには、参照によって関数を取得するのではなく、値によって関数を取得するため、次のように宣言する必要があります。TVecDoubnewt<VecDoub>VecDoub&VecDoub&newtvectfuncnewtTnewtnewt<VecDoub>(pt, check, &vecfunc)newt(pt, check, &vecfunc)newtnewt

template <class T>
void newt(VecDoub_IO &x, Bool &check, T vecfunc)

関数は通常小さなオブジェクトまたはポインタであるため、これは機能し、パフォーマンスを低下させることはありません

于 2012-10-19T15:58:03.193 に答える
1

関数を呼び出して、関数自体ではなく、戻り値をパラメーターとして渡すことになっているためです。

newt<const VecDoub>(pt, check, vecfunc(something) );

const参照は定数である必要があるため、追加しました。そうしvecfuncないと、一時的なものであるため、からの戻り値をバインドできません。

説明する:

newt<VecDoub>(pt, check, &vecfunc);

次のような関数を呼び出そうとします

newt_VecDoub(VecDoub_IO &x, Bool &check, VecDoub &vecfunc);

渡そうとする3番目のパラメーター&vecfuncは、タイプVecDoub (__cdecl *)(VecDoub_I)がであるため、明らかに機能しません。

于 2012-10-19T15:47:03.160 に答える