1

私は次のようなクラスを持っています:

#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);
}

最初の例のエラーの説明は何ですか?

4

3 に答える 3

8

完全に無関係な型へのキャストを実行するには、 reinterpret_castnot aを使用する必要があります。static_castこれを参照してください static_cast、dynamic_cast、const_cast、および reinterpret_cast を使用する場合 さまざまなタイプの C++ キャストの詳細については、

于 2012-08-27T18:06:58.477 に答える
3

static_castintto floatdoubletoなどの関連する型のキャスト、または単一パラメーター コンストラクターの呼び出しやユーザー定義の変換関数の呼び出しなど、ほとんどfloat労力を必要としない変換に使用されます。

LPARAMthisはほとんど無関係なので、必要なのは次のreinterpret_castとおりです。

LPARAM lparam =  reinterpret_cast<LPARAM>(this);
EnumChildWindows(GetDesktopWindow(), MyClass::proc, lparam);
于 2012-08-27T18:08:58.220 に答える
0

ご存じのとおり、 this ポインターはconstであり、 static_cast 演算子はconstvolatile、または__unaligned属性をキャストすることはできません。MSDNのこのリンクを見てください。

于 2012-08-27T18:19:52.380 に答える