模板化方法指针 - 无法匹配函数参数的指针
Templated method pointer - can't match pointer for function argument
我正在制作这样的方法指针包装器:
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 中传递参数,它仍然告诉我:
no instance of overloaded function matches the argument list
OBJECT::*method
不直接匹配TestClass::TestMethod
吗?我也试了&TestClass::TestMethod
,也不对。
您在调用 _getWrapper
时显式指定了模板参数,而模板参数 OBJECT
的第一个参数指定为 int
,这是错误的。因为成员指针不能引用 non-class 类型。
改变
_getWrapper<int, float, bool>(&testObj, TestClass::TestMethod)
至
_getWrapper<TestClass, int, float, bool>(&testObj, &TestClass::TestMethod)
// ~~~~~~~~~~
请注意,您可以只依赖 template type deduction,例如
_getWrapper(&testObj, &TestClass::TestMethod)
顺便说一句:要从成员那里获取地址,您应该始终使用 &
。
顺便说一句:我想 TestClass::TestMethod
是 public
.
我正在制作这样的方法指针包装器:
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 中传递参数,它仍然告诉我:
no instance of overloaded function matches the argument list
OBJECT::*method
不直接匹配TestClass::TestMethod
吗?我也试了&TestClass::TestMethod
,也不对。
您在调用 _getWrapper
时显式指定了模板参数,而模板参数 OBJECT
的第一个参数指定为 int
,这是错误的。因为成员指针不能引用 non-class 类型。
改变
_getWrapper<int, float, bool>(&testObj, TestClass::TestMethod)
至
_getWrapper<TestClass, int, float, bool>(&testObj, &TestClass::TestMethod)
// ~~~~~~~~~~
请注意,您可以只依赖 template type deduction,例如
_getWrapper(&testObj, &TestClass::TestMethod)
顺便说一句:要从成员那里获取地址,您应该始终使用 &
。
顺便说一句:我想 TestClass::TestMethod
是 public
.