私は今、これに対する解決策を数日間探しています。残念ながら答えるのに十分な関連性のある質問は見つかりませんでした。ここに私の質問があります。次のコードを検討してください。
// dummy class A
class A {
public:
void aFunction() { // <- this is the function I want to point at
cout << "aFunction() is called\n";
}
};
class B {
public:
template <class Class> // get a function pointer
void setFunction( void (Class::*func)() ) {
p_func = func;
}
void (*p_func)(); // the function pointer
}
int main() {
B obj;
objb.setFunction(&A::aFunction);
return 0;
}
にコンパイルエラーがありsetFunction()
ますp_func = func;
:
'void(__thiscall A :: *)(void)'から'void(__cdecl *)(void)'に変換できません
そして、私はそれをどうにかして取り除くことができないようです。私はそれがそれらの目に見えないthis
ポインタ(__thiscall
と__cdecl
)と関係があることを知っていますが、これらを処理する方法がわかりません。同じ構造になるようにメンバー変数p_func
もクラステンプレートにしようとしvoid (Class::*p_func)()
ましたが(なぜ?)、1つのクラスに2つのクラステンプレートを含めることは違法であるように思われるため(なぜ?)、正しい解決策ではありません。今回、コンパイラは次のことについて不平を言います。
複数のテンプレートパラメータリストは許可されていません
このメソッド(テンプレートなし)はグローバル関数(現在使用している回避策)で完全に機能し、ライブラリ(sfgui)での使用を確認したので、完全に可能であるはずです。
なぜこれが必要なのかを理解するために、ボタンを作成しようとしています。このボタンは、私が望むどんな関数でも呼び出すことができるはずです。start()
今のところ、作成しているアニメーションクラスの関数を呼び出したいと思います。
ps:実行できないので、この例は役に立たないことを知っていますp_func
:関数は静的ではありません。それでもオブジェクトポインタ(setFunction( void (Class::*func)(), Class* )
)を追加する必要がありますが、それは問題ではないようです。typedef
そして、私は関数ポインタをより読みやすくすることを知っていますが、クラステンプレートではありません。
編集
さらに調査した結果、私はこの質問に対する答えではなく、別の質問に対する答えが必要だと思います。template <class Class>
かつて、私は複数が実際に許可されていることに気づきました。ただし、コンパイラーは、どちらを使用する必要があるかをコンパイラーが認識できない可能性があるため、メンバー変数では許可されていません。これclass
がエラーの原因である可能性があります。
複数のテンプレートパラメータリストは許可されていません
これは奇妙な説明です。とにかく助けてくれてありがとう、あなたは私にもっと良い洞察を与えてくれました。