我的课程如下:
#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);
}
第一个例子中错误的解释是什么?
答案 0 :(得分:8)
您需要使用reinterpret_cast
而不是static_cast
来执行强制转换为完全不相关的类型。有关不同类型的C ++强制转换的详细信息,请参阅此When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?。
答案 1 :(得分:3)
static_cast
用于投放相关类型,例如int
到float
,double
到float
,或转换需要很少的努力,例如调用单参数构造函数或调用用户定义的转换函数。
LPARAM
和this
几乎无关,所以您需要的是reinterpret_cast
:
LPARAM lparam = reinterpret_cast<LPARAM>(this);
EnumChildWindows(GetDesktopWindow(), MyClass::proc, lparam);
答案 2 :(得分:0)
如您所知,this指针是 const ,static_cast运算符无法抛弃 const , volatile 或 __ unaligned 属性。看看this link on MSDN。