C ++クラスで非常に複雑なC関数を使用する際に問題が発生しました(C関数の書き換えはオプションではありません)。C関数:
typedef void (*integrand) (unsigned ndim, const double* x, void* fdata,
unsigned fdim, double* fval);
// This one:
int adapt_integrate(unsigned fdim, integrand f, void* fdata,
unsigned dim, const double* xmin, const double* xmax,
unsigned maxEval, double reqAbsError, double reqRelError,
double* val, double* err);
自分で型のvoid関数を指定する必要がありintegrand
、adapt_integrateはn次元の積分を計算します。calcTripleIntegral
スタンドアロン関数の場合、(以下の)コードはスタンドアロン関数としてfunc
機能します。(非静的!)クラスメンバー関数を被積分関数として渡したいのですが、これは簡単にオーバーロードされる可能性があるためです...
class myIntegrator
{
public:
double calcTripleIntegral( double x, double Q2, std::tr1::function<integrand> &func ) const
{
//...declare val, err, xMin, xMax and input(x,Q2) ...//
adapt_integrate( 1, func, input,
3, xMin, xMax,
0, 0, 1e-4,
&val, &err);
return val;
}
double integrandF2( unsigned ndim, const double *x, void *, // no matter what's inside
unsigned fdim, double *fval) const; // this qualifies as an integrand if it were not a class member
double getValue( double x, double Q2 ) const
{
std::tr1::function<integrand> func(std::tr1::bind(&myIntegrator::integrandF2, *this);
return calcTripleIntegral(x,Q2,func);
}
}
GCC 4.4.5(プレリリース)では、これにより次のことがわかります。
エラー:変数'std :: tr1 :: function func'には初期化子がありますが、型が不完全です
編集:私のコードのエラーは何ですか?GCC 4.4、4.5、および4.6でコンパイルしようとしましたが、すべて同じエラーが発生しました。これについては何も行われていないか、何か間違ったことをしました/ EDIT
どうもありがとうございました!よくわからない場合は、喜んで詳しく説明します。
PS:myIntegrator.cppのどこかで定義された関数への関数ポインターを使用して、tr1を使わずにこれを回避できますか?
最終更新:わかりました。TR1がこれに対して1行または2行のソリューションを提供していると誤解しました。残念。クラスを名前空間に「変換」し、関数宣言をコピーして貼り付けています。必要なのは、インターフェイスを再実装した1つの基本クラスと1つのサブクラスだけです。C関数ポインタ+C++クラス=私にとって悪いニュース。とにかくすべての答えをありがとう、あなたは私にC ++のいくつかの暗いコーナーを見せてくれました;)