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


平安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)”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章