关闭

“error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误

243人阅读 评论(0) 收藏 举报
分类:

在一个类中声明一个函数指针,在另一个类中声明一个函数,将该函数地址赋给该指针时出现:“error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误:

[cpp] view plain copy
  1. /*CSeries.h*/  
  2.   
  3. typedef void (CALLBACK* ONSERIESREAD)(void * pOwner, BYTE* buf, DWORD dwBufLen );  
  4.   
  5. class CSeries  
  6. {  
  7. public:  
  8.     CSeries(void);  
  9.     ~CSeries(void);  
  10. public:  
  11.     ONSERIESREAD m_OnSeriesRead;   
  12. };  
另一个类中:
[cpp] view plain copy
  1. /*CSerAssistantDlg.h*/  
  2.   
  3. class CSerAssistantDlg : public CDialog  
  4. {  
  5. private:  
  6.     void CALLBACK OnRecData(void * pOwner, BYTE* buf, DWORD dwBufLen);  
  7. };  
  8.   
  9. //---------------------------使用时如下-------------------------  
  10. CSeries *mySer = new CSeries;  
  11. mySer->m_OnSeriesRead = OnRecData;  
出现如下错误:
[cpp] view plain copy
  1. error C3867: “CSerAssistantDlg::OnRecData”: 函数调用缺少参数列表;请使用“&CSerAssistantDlg::OnRecData”创建指向成员的指针  

错误原因是:静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存,因为普通成员函数要执行时我们必须要确定他是属于哪个类对象才能执行,而类的static函数是不属于这个类的,他是在编译器编译时期就已经确定的,普通成员函数是在有了类对象之后才能执行。而OnRecData是普通成员函数地址
[cpp] view plain copy
  1. 例如:声明一个类:class A{   
  2.             public:       
  3.                     static void func1();  
  4.                 void func2();};  
  5.         则会出现如下:     typedef void (*b)();  
  6.                     b myfunc1 = func1;  //valid  
  7.                     b myfunc2 = func2;      //error  


修改如下即可:

[html] view plain copy
  1. static void CALLBACK OnRecData(void * pOwner, BYTE* buf, DWORD dwBufLen);  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33788次
    • 积分:638
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:84篇
    • 译文:1篇
    • 评论:3条
    文章分类
    最新评论