構造体Bは2つの構造体を持ちます。構造体Bは構造体Aから継承します。構造体Bから構造体Aのパラメータとして関数を渡します。C++継承された構造体の関数のパラメータとしてstruct関数を渡します。
これは達成したい問題の例で、私が実行している問題は、完全なコードはTL; DRです。
struct A
{
int32 mynum;
void Tick(float delta, bool doThis, void (funcparam)(float, bool, int32))
{
funcparam(delta, doThis, mynum);
}
};
struct B : public A
{
void RunThis(float deltaTime, bool doIt, int32 which)
{
// do something when called by Struct A
};
void DoSomething()
{
Tick(0.1f, true, &B::RunThis);
};
};
問題は、この行である:私は最初から間違ったことをやったが、それは、ヘッダ内まだですので、私はそれが間違って渡しています想像していない限り機能void DoSomething()
からTick(0.1f, true, &B::RunThis);
私が現在定義している構造体の?
エラー(私は私の例に合わせて、エラーを修正している、私は私が台無しとは思わない。):
error C2664: 'void A::Tick(float,bool,void (__cdecl *)(float,bool))': cannot convert argument 3 from 'void (__cdecl B::*)(float,bool)' to 'void (__cdecl *)(float,bool)'
何も解決しませんもちろんの&B::RunThis
からB::
を省略します。
'std :: function()'を見て、あなたの関数ポインタ 'void(funcparam)(float、bool、int32)'はメンバ関数ポインタを取ることができません。 –
'' void(funcparam)(float、bool、int32) ''はあなたが望むものではありません。まず、(メンバーではない)関数ポインタのシグネチャは 'void(* funcparam)(float、bool、int32)' 'です(*が足りません)。次に、Tick()を基本クラスの関数にすることができます。この関数は派生クラスでオーバーライドする仮想関数を呼び出します。これは、 "派生クラス"の1:1の関係を持つ限り、 "std:function''を使用するよりも優れたアプローチです:"実行したい関数 "。 – BitTickler
@BitTickler - それは私の目的のためのより良い解決策でした、ありがとう!具体的な質問に対する回答については、私はそれが似たような問題をGoogleの人々が正確な答えを持つように投稿されるのを待つつもりです – Vii