2012-08-27 46 views
1

我的類,如下所示:傳遞this指針作爲LPARAM

#include <Windows.h> 
class MyClass 
{ 
    void A(); 
    static BOOL CALLBACK proc(HWND hwnd, LPARAM lParam); 
}; 

void MyClass::A() 
{ 
    EnumChildWindows(GetDesktopWindow(), MyClass::proc, static_cast<LPARAM>(this)); 
} 

BOOL CALLBACK MyClass::proc(HWND hwnd, LPARAM lParam) 
{ 
    // ... 
    return TRUE; 
} 

當我嘗試在Visual C++ 2010編譯,我得到以下編譯器錯誤:

錯誤C2440:'的static_cast:MyClass的* const的」不能將‘’到‘LPARAM’ 沒有上下文中,這種轉換是可能

如果我改變的MyClass::A定義如下,然後編譯成功:

void MyClass::A() 
{ 
    EnumChildWindows(GetDesktopWindow(), MyClass::proc, (LPARAM)this); 
} 

第一個例子中的錯誤的解釋是什麼?

回答

3

static_cast被用於鑄造相關的類型,如intfloat,和doublefloat,或轉換其需要太少努力,諸如調用單參數構造函數,或調用用戶定義的轉換功能。

LPARAMthis是幾乎不相關的,所以你需要的是reinterpret_cast

LPARAM lparam = reinterpret_cast<LPARAM>(this); 
EnumChildWindows(GetDesktopWindow(), MyClass::proc, lparam); 
0

如你所知,這個指針常量和的static_cast操作者不能丟掉常量易失性__unaligned屬性。看看this link on MSDN