ulak blade
ulak blade

Reputation: 2665

Templated method pointer - can't match pointer for function argument

I am making a method pointer wrapper like this:

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

The problem is right at the calling of _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;
}

Not matter in what way I try to pass the arguments in _getWrapper, it still tells me:

no instance of overloaded function matches the argument list

Doesn't OBJECT::*method match TestClass::TestMethod directly? I also tried &TestClass::TestMethod, doesn't match either.

Upvotes: 2

Views: 80

Answers (1)

songyuanyao
songyuanyao

Reputation: 172964

You're specifying the template arguments explicitly when invoking _getWrapper, and the first one is specifed as int for template parameter OBJECT, which is wrong. Because member pointers can't refer into non-class type.

Change

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

to

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

Note you can just rely on template type deduction, e.g.

_getWrapper(&testObj, &TestClass::TestMethod)

BTW: For taking address from members you should always use & for it.
BTW: I suppose TestClass::TestMethod is public.

Upvotes: 3

Related Questions