我正在为此寻找解决方案几天。没有找到任何相关的问题足以令人遗憾地回答,所以这是我的问题。考虑下一个代码:
// dummy class A
class A {
public:
void aFunction() { // <- this is the function I want to point at
cout << "aFunction() is called\n";
}
};
class B {
public:
template <class Class> // get a function pointer
void setFunction( void (Class::*func)() ) {
p_func = func;
}
void (*p_func)(); // the function pointer
}
int main() {
B obj;
objb.setFunction(&A::aFunction);
return 0;
}
我有一个编译setFunction()
错误p_func = func;
:
无法从 'void (__thiscall A::* )(void)' 转换为 'void (__cdecl *)(void)'
而且我似乎无法以任何方式摆脱它。我知道这与那些不可见的this
指针(__thiscall
和__cdecl
)有关,但我不知道如何处理这些。我也尝试将成员变量设为类模板p_func
(void (Class::*p_func)()
这次编译器抱怨:
不允许使用多个模板参数列表
这种方法(没有模板)在全局函数(这是我目前使用的解决方法)上完美地工作,我在库(sfgui)中看到了它的使用,所以它应该是完全可能的。
要了解我为什么想要这个的背景信息:我正在尝试创建一个按钮。这个按钮应该能够调用我想要的任何功能。现在,我希望它调用start()
我正在制作的动画类的函数。
ps:我知道这个例子没用,因为我无法运行p_func
:函数不是静态的。我仍然需要添加一个对象指针 ( setFunction( void (Class::*func)(), Class* )
),但这似乎不是问题。而且我知道typedef
要使函数指针更具可读性,但不能使用类模板。
编辑
经过更多研究,我认为答案我不需要这个问题的答案,而是另一个问题。这一次,我注意到template <class Class>
实际上允许多个。但是,在成员变量上是不允许的,因为编译器不可能知道class
他需要使用哪个,这可能是错误的原因
不允许使用多个模板参数列表
这是一个奇怪的描述。无论如何,感谢您的帮助,您确实给了我更好的见解。