如何执行指向模板函数内的类方法的函数指针?



我想要一个可以在另一个类内部调用的函数,该类具有类型void函数指针的单个输入参数。在函数内部,函数指针应该执行它所指向的函数。

// inside 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的构造函数中像这样调用函数会产生以下编译错误:
// inside TestClass.cpp
TestClass::TestClass()
{
TestClass::TestingFctPtrStatic<TestClass>(&TestClass::PrintStuff, this);
}

与PrintStuff ():

void TestClass::PrintStuff()
{
std::cout << "Printing stuff!" << std::endl;
}

错误C2039: 'TestFunction':不是'TestClass'的成员消息:参见声明'TestClass'参见函数模板实例化的参考'void TestClass::TestingFctPtrStatic(void (__cdecl TestClass::*)(void),UserClass *)'正在编译与[UserClass = TestClass)

编辑:

我通过在实现中使用更多的括号来修复它:

template<class UserClass>
inline void TestClass::TestingFctPtrStatic(void (UserClass::* TestFunction)(void), UserClass* Object)
{
(Object->*TestFunction)();
}
void(UserClass::* TestFunction)(void)

这不是指向函数的指针。它是指向类方法的指针。

TestFunction();

你不能凭空调用一个类方法。你需要一个对象,一个类的实例,它的方法被调用。如果p是指向UserClass的指针,也就是说:

UserClass *p=(points to somewhere);

则使用以下语法调用它的方法:

(p->*TestFunction)();

从问题的描述中不清楚调用其方法的对象来自何处,因此您需要根据问题中未包含的所有其他信息自己弄清楚。以某种形式或方式,你需要找到一个UserClass对象,在某个地方——要么作为一个额外的参数传递进来,要么它躺在周围,在某个地方,在一般附近——然后你可以使用TestFunction指针来调用这个对象的方法。

这是c++的基础,前提是这是一个类方法。如果这个PrintStuff是一个static类方法,那么这确实是一个普通的旧函数指针:

void (*TestFunction)();

它将通过指针被调用,这与其他函数没有什么不同。

最新更新