将'this'指针传递为LPARAM

JBe*_*ley 1 c++ winapi casting compiler-errors visual-studio-2010

我有如下课程:

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在Visual C++ 2010中编译它时,我得到以下编译器错误:

错误C2440:'static_cast':无法从'MyClass*const'转换为'LPARAM'没有可以进行此转换的上下文

如果我更改MyClass::A如下定义,则编译成功:

void MyClass::A()
{
   EnumChildWindows(GetDesktopWindow(), MyClass::proc, (LPARAM)this);
}
Run Code Online (Sandbox Code Playgroud)

第一个例子中错误的解释是什么?

shf*_*301 8

您需要使用a reinterpret_cast而不是static_cast执行转换为完全不相关的类型.请参阅此应何时使用static_cast,dynamic_cast,const_cast和reinterpret_cast?有关不同类型的C++强制转换的更多详细信息.


Naw*_*waz 5

static_cast用于转换相关类型,例如inttofloatdoubleto float,或不需要太多努力的转换,例如调用单参数构造函数,或调用用户定义的转换函数。

LPARAM并且this几乎不相关,所以你需要的是reinterpret_cast

LPARAM lparam =  reinterpret_cast<LPARAM>(this);
EnumChildWindows(GetDesktopWindow(), MyClass::proc, lparam);
Run Code Online (Sandbox Code Playgroud)