成员函数指针作为形参调用


平安2010

[新手]
已解决 

c++编译错

50分
标签: c++  编译  test  程序编译  桌面 
回答:3   浏览:609   提问时间: 2010-03-02 10:37
#include <stdio.h> 
class Man 

private: 
typedef struct sAct{ 
void (*Func)(); 
sAct(){Func = NULL;} 
}sAct; 
protected: 
sAct *m_Act; 
public: 
Man(){m_Act = NULL;} 
void Move(){;} 
void ActionSet(void (*Func)()){;} 
}; 
int main() 

Man man; 
man.ActionSet(man.Move); 
return 0; 


这个程序编译后,错误是: 
C:/Documents and Settings/microsoft/桌面/test/main.cpp(21) 
: error C2664: 'ActionSet' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)' 
None of the functions with this name in scope match the target type 
把void Move(){;}改成static void Move(){;}后编译成功,为什么啊?
最佳答案  最佳答案  此答案由提问者自己选择,并不代表爱问知识人的观点
揪错 ┆  评论

忆梦潇湘

[学长] 向忆梦潇湘提问
成员函数是this call的, 调用的时候默认会将this指针作为函数最后一个参数;而静态成员函数通过静态,脱离了this,所以是可以强转为一般函数指针的,也就是上面的cdecl。 
如果你想保存成员函数为一般函数指针,并像普通函数那样用,那就只有声明其为静态一种方式。 

另外针对你的例子,不改成static的方式是如下的: 


#include <stdio.h> 
class Man 

private: 
typedef struct sAct{ 
void (*Func)(); 
sAct(){Func = NULL;} 
}sAct; 
protected: 
sAct *m_Act; 
public: 
Man(){m_Act = NULL;} 
void Move(){;} 
void ActionSet(void (Man::*Func)()){;} 
}; 
int main() 

Man man; 
man.ActionSet(&Man::Move); 
return 0; 


ps:请使用最新的编译器,以方便查错: 
我的vs2008是这么写的,明显多了: 
error C2664: “Man::ActionSet”: 不能将参数 1 从“void (__thiscall Man::* )(void)”转换为“void (__cdecl *)(void)”

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值