2014-04-04 115 views
0

有人可以幫我解決這個錯誤嗎?我是C++新手。而且它似乎錯誤發生在一堆宏中。我能做些什麼來解決它?或者我怎樣才能追蹤到源頭?Casting error in C++

我真的不明白這個錯誤。這是否意味着編譯器試圖將方法void ReadCPUparameter()轉換爲LRESULT funcName(WPARAM wParam, LPARAM lParam)函數頭? 。

錯誤:

// error C2440: 'static_cast' : cannot convert from 
//  'void (__thiscall CStartup::*)(void)' to 
//  'LRESULT (__thiscall CWnd::*)(WPARAM,LPARAM)'. 
// 
// ON_MESSAGE(WM_UPLOAD_CPU_PARAMETER,ReadCPUparameter) // error here 

(我沒有寫這個,我需要重新編譯從Win2000的一個老項目Win7的機器上老VS6.0項目 - > VS2010教授。 。)

代碼:

// class CStartup : public CDialog {}; 

#include "stdafx.h" 
#include "MU.h" 
#include "Startup.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 

CStartup::CStartup(CWnd* pParent /*=NULL*/) : CDialog(CStartup::IDD, pParent) 
{ 
    p_p = &cpu_par; 
} 

void CStartup::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
} 

BEGIN_MESSAGE_MAP(CStartup, CDialog) 
    ON_WM_SHOWWINDOW() 
    ON_MESSAGE(WM_UPLOAD_CPU_PARAMETER,ReadCPUparameter) // error here 
END_MESSAGE_MAP() 

const int nLanguageIds_Language[] = 
{ 
    // ... 
}; 


#define MAX_READINGS 200 

BOOL CStartup::OnInitDialog() 
{ 
    // ... 
} 

void CStartup::OnOK() 
{ 
    CDialog::OnOK(); 
} 

int CStartup::Check_OnRead() 
{ 
    // ... 
} 

void CStartup::ReadCPUparameter() 
{ 
    // ... 
} 

void CStartup::OnShowWindow(BOOL bShow, UINT nStatus) 
{ 
    CDialog::OnShowWindow(bShow, nStatus); 
    PostMessage(WM_UPLOAD_CPU_PARAMETER);  
} 
+0

我認爲錯誤消息確切說,這是錯誤的。所以爲什麼不將函數簽名修改爲預期的簽名。 –

+0

@vlad_tepesch你能指出我的意思嗎?請閱讀問題的第二段。我不熟悉C++錯誤。 – Bitterblue

回答

3

ON_MESSAGE宏後面的代碼預計爲ReadCPUparameter有以下簽名: 'LRESULT (__thiscall CWnd::*)(WPARAM,LPARAM)'.由於實際簽名不同,所以抱怨兩個函數指針的類型不兼容。 就像將struct Oranges*傳遞給期望struct Apples*的函數。

我猜CDialog繼承CWND,所以你必須做你的函數簽名改爲

LRESULT Startup::ReadCPUparameter(WPARAM wparam, LPARAM lparam); 
+0

你也可以告訴我,'ON_MESSAGE'是一個在Windows消息中註冊我的函數的宏。那是我不知道的一件事。不管怎麼說,多謝拉!我解決了其中的2個錯誤,現在我明白了。該項目實際編制。 ^^ – Bitterblue

+0

@迷你我我不知道任何有關MFC的東西。我剛剛閱讀(並理解)編譯器錯誤消息。很好地解釋了這個問題, –

+0

。它發生的原因是VS6編譯器不夠聰明以檢測錯誤。 –