如何在模板函数中执行指向类成员方法的函数指针?
类成员函数指针调用的编译错误修复
问题场景
要实现一个可在其他类中调用的静态函数,它接收无返回值的类成员函数指针参数,并在内部执行该指针指向的方法。相关代码如下:
TestClass.h 代码
class TestClass { public: template<class UserClass> static void TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object); }; template<class UserClass> inline void TestClass::TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object) { Object->TestFunction(); }
TestClass.cpp 中构造函数调用
TestClass::TestClass() { TestClass::TestingFctPtrStatic<TestClass>(&TestClass::PrintStuff, this); }
PrintStuff 方法定义
void TestClass::PrintStuff() { std::cout << "Printing stuff!" << std::endl; }
编译错误
编译时触发如下错误:
error C2039: 'TestFunction': is not a member of 'TestClass'
message : see declaration of 'TestClass'
message : see reference to function template instantiation 'void TestClass::TestingFctPtrStatic(void (__cdecl TestClass::* )(void),UserClass *)' being compiled
with
[
UserClass=TestClass
]
问题根源
编译器将Object->TestFunction()误解析为访问Object的TestFunction成员变量,而非调用成员函数指针指向的方法。这是因为成员函数指针的调用运算符->*优先级低于函数调用运算符(),导致语法解析逻辑出错。
修复代码
调整静态函数的实现,给成员函数指针调用加上括号,明确运算优先级:
template<class UserClass> inline void TestClass::TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object) { (Object->*TestFunction)(); }
用括号把Object->*TestFunction包裹后,编译器会先完成成员函数指针与对象的绑定,再执行函数调用操作,从而正确触发目标方法。
内容的提问来源于stack exchange,提问作者Randy
相关产品推荐
相关产品推荐

