You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在模板函数中执行指向类成员方法的函数指针?

类成员函数指针调用的编译错误修复

问题场景

要实现一个可在其他类中调用的静态函数,它接收无返回值的类成员函数指针参数,并在内部执行该指针指向的方法。相关代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:45:29