1. 程式人生 > >“error C3867: “XXX”: 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標”的錯誤

“error C3867: “XXX”: 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標”的錯誤

在一個類中宣告一個函式指標,在另一個類中宣告一個函式,將該函式地址賦給該指標時出現:“error C3867: “XXX”: 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標”的錯誤:

/*CSeries.h*/

typedef void (CALLBACK* ONSERIESREAD)(void * pOwner, BYTE* buf, DWORD dwBufLen );

class CSeries
{
public:
	CSeries(void);
	~CSeries(void);
public:
	ONSERIESREAD m_OnSeriesRead; 
};

另一個類中:

/*CSerAssistantDlg.h*/

class CSerAssistantDlg : public CDialog
{
private:
	void CALLBACK OnRecData(void * pOwner, BYTE* buf, DWORD dwBufLen);
};

//---------------------------使用時如下-------------------------
CSeries *mySer = new CSeries;
mySer->m_OnSeriesRead = OnRecData;

出現如下錯誤:

error C3867: “CSerAssistantDlg::OnRecData”: 函式呼叫缺少引數列表;請使用“&CSerAssistantDlg::OnRecData”建立指向成員的指標


錯誤原因是:靜態成員函式的地址可用普通函式指標儲存,而普通成員函式地址需要用類成員函式指標來儲存,因為普通成員函式要執行時我們必須要確定他是屬於哪個類物件才能執行,而類的static函式是不屬於這個類的,他是在編譯器編譯時期就已經確定的,普通成員函式是在有了類物件之後才能執行。而OnRecData是普通成員函式地址

	例如:宣告一個類:class A{ 
				public:		
				        static void func1();
					void func2();};
			則會出現如下:		typedef void (*b)();
						b myfunc1 = func1;	//valid
						b myfunc2 = func2;      //error

修改如下即可:

static void CALLBACK OnRecData(void * pOwner, BYTE* buf, DWORD dwBufLen);