【发布时间】:2013-03-11 18:48:53
【问题描述】:
我这几天一直在寻找解决方案。没有找到任何相关的问题足以令人遗憾地回答,所以这是我的问题。 考虑下一个代码:
// 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)()),因此它具有相同的结构,但在一个类中包含 2 个类模板似乎是非法的(为什么?),因此不是正确的解决方案。这次编译器抱怨:
不允许有多个模板参数列表
这种方法(没有模板)在全局函数上完美运行(这是我目前使用的解决方法),我看到它在库 (sfgui) 中的使用,所以它应该是完全可能的。
为了了解我想要这个的原因:我正在尝试创建一个按钮。这个按钮应该能够调用我想要的任何功能。现在,我希望它调用我正在制作的动画类的 start() 函数。
ps:我知道这个例子没用,因为我不能运行p_func:函数不是静态的。我仍然需要添加一个对象指针 (setFunction( void (Class::*func)(), Class* )),但这似乎不是问题。而且我知道typedef 可以使函数指针更具可读性,但不适用于类模板。
编辑
经过更多研究后,我认为我需要的答案不是这个问题的答案,而是另一个问题的答案。这一次,我注意到多个template <class Class> 实际上是允许的。但是,成员变量不允许这样做,因为编译器不可能知道他需要使用哪个class,这可能是错误的原因
不允许有多个模板参数列表
这是一个奇怪的描述。无论如何感谢您的帮助,您确实给了我更好的见解。
【问题讨论】:
-
指向成员函数的指针与指向非成员函数的指针是完全不同的类型——您不能将两者混合使用(并且要使用指向成员函数的指针,您需要类似
object.*pmf())。
标签: c++ pointers function-pointers