2011-12-08 29 views
3

私はC++のコードを持っていると私は本当にそれでC関数を使用する必要があります。関数ポインタとC++のテンプレート

楽しい
int procedure(... , S_fp fun , ...) 

- 署名はそのようでなければならない関数へのポインタです:

int fun(double* , double* , double) 

機能、私が使用したいポインタ、クラステンプレートのメンバーである:

template<int nPar> class PenaltyAlgorithm 
{ 
public: 
... 
int Calculate(double* param, double* val, double prec) 
{ 
    ... 
} 
... 
} 

あなたが見ることができるように、その署名は順序通りです。しかし、私がこれをするとき: プロシージャ(... & PenaltyAlgorithm :: Calculate、...);

私はエラーを取得する:

error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ... 

してください、助けて。追加情報が必要な場合は、お書きください。

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

答えを読んだ後、私はそれがクラスに関する情報を追加することが重要だと理解:

template<int nPar> class PenaltyAlgorithm 
{ 
public: 
int Calculate(double* param, double* val, double prec) 
    { 
    *val = comp_fun->Compute(param); 
    } 

double* RunAlgorithm() 
    { 
     ... 
     procedure(... &PenaltyAlgorithm<nPar>::Calculate, ...); 
     ... 
    } 
... 
private: 
... 
CompositeFunction<nPar>* comp_fun; 
} 

1)。この楽しみはクラスのメンバーにアクセスする必要があるので、私は静的な楽しみを使用することはできません。

2)。私たちは、クラスの楽しいメンバーから「手続き」と呼ばれる事実を使用できますか?

+0

あなたの署名が明らかに間違っているように、クラスに関数を呼び出す –

+1

は、暗黙のthisポインタを渡す '' ....静的int型Calculがしてみてください。 [C++のよくある質問](http://www.parashift.com/c++-faq-lite/pointers-to-members.html)を読んでください。 – stonemetal

答えて

0

静的メンバー関数でない限り、そのようなポインタをメンバー関数に渡すことはできません。

0

あなたは計算がPenaltyAlgorithm上の非静的メソッドである代わりに

int Calculate(double* param, double* val, double prec) 
3

static int Calculate(double* param, double* val, double prec) 

を使用し、Calculateは、静的ようにする必要があります。それはPenaltyAlgorithmのインスタンスを実行する必要があるので、プレーン関数ポインタとしてC関数に供給することはできません。

計算機能を静的にすることはできますか?可能であれば、C関数ポインタと同じように動作するはずですが、PenaltyAlgorithmクラスの非静的データにアクセスすることはできません。

1

インスタンスメンバとしてint Calculate(double* param, double* val, double prec)には、グローバル関数またはスタティックメンバにはないthisポインタが隠されています。これがなければ、それはそれを実行するにはPenaltyAlgorithmを知らないでしょう。

ポインターは、int (PenaltyAlgorithm::*)(double* param, double* val, double prec)またはCalculateのいずれかの静的にする必要があります。

1

int procedure(... , S_fp fun , ...)が間違いなくC関数である必要がある場合は、探しているものを直接行う方法はありません。クラスメンバ関数ポインタを渡そうとすると、スタック内の最初の引数としてこのポインタが隠されます。そのため、プロトタイプは一致しません。

ただし、内部的に保存されたインスタンスポインタを使用してPenaltyAlgorithmクラスに間接的にアクセスするグローバル関数または静的関数を作成できます。

1)procedure関数に渡すクラスのインスタンスポインタをグローバル変数に保存します。

2)は、新しいグローバル関数int CalculateGlobal(double* param, double* val, double prec)

3)あなたのprocedure関数の関数ポインタとしてCalculateGlobal関数のポインタを渡しを作成します。

4)CalculateGlobal関数は、保存されたインスタンスポインタを使用して、特定のクラスの内部構造体にアクセスできます。

まあ、これは当然の物事の良い方法ではありません...

関連する問題