2

のためのポインタを一致させることはできません私はこのようなメソッドポインタラッパーを作っています:template宣言メソッドポインタが - 関数の引数

template<typename OBJECT, typename... ARGS> 
method_wrapper<ARGS...> _getWrapper(OBJECT* object, void (OBJECT::*method)(ARGS...)) 
{ 
    //irrelevant 
} 

問題は右_getWrapperの呼び出しである:

class TestClass 
{ 

    void TestMethod(int a, float b, bool c) 
    { 
     std::cout<<a<<std::endl; 
     std::cout<<b<<std::endl; 
     std::cout<<c<<std::endl; 
    } 
}; 

int main() 
{ 
TestClass testObj; 

method_wrapper<int, float, bool> wrap = _getWrapper<int, float, bool>(&testObj, TestClass::TestMethod); 

wrap.callInternal(1000, 3.14, true); 

//... 

system("pause"); 

return 0; 
} 

ありません私が_getWrapperで引数を渡そうとしているところで問題になっていますが、それでも私にはわかります:

オーバーロードされた関数のインスタンスはありません引数リストに一致します

OBJECT::*methodは一致しません。TestClass::TestMethodに直接一致しますか?私も&TestClass::TestMethodを試しましたが、いずれにも一致しません。

答えて

3

_getWrapperを呼び出すときにテンプレート引数を明示的に指定していて、テンプレートパラメータOBJECTの最初のパラメータがintと誤って指定されています。メンバポインタは非クラス型を参照できないためです。

_getWrapper<TestClass, int, float, bool>(&testObj, &TestClass::TestMethod) 
//   ~~~~~~~~~~ 

変更

_getWrapper<int, float, bool>(&testObj, TestClass::TestMethod) 

は、例えば、あなたがtemplate type deductionにだけ頼ることができます

BTW:メンバーからアドレスを取得するには、常に&を使用する必要があります。
目白:TestClass::TestMethodpublicとします。

+0

はい、それを修正しました。ありがとう –