E2031 'type1' から 'type2' へのキャストはできない (C++)
型 'ident1' から型 'ident2' へはキャストできません。
C++ では,メンバー関数ポインタを通常の関数ポインタにキャストすることはできません。
例を示します。
class A {
public:
int myex();
};
typedef int (*fp)();
test()
{
fp myfp = (fp) &A::myex; //エラー
return myfp();
}
クラスメンバー関数は非表示パラメータ(this ポインタ)を受け取るため,通常の関数ポインタとはかなり異なる動作を行います。
静的メンバー関数は,通常の関数ポインタのように動作し,キャストできます。
例を示します。
class A {
public:
static int myex();
};
typedef int (*fp)();
test()
{
fp myfp = (fp) &A::myex; //OK
return myfp();
}
ただし,静的メンバー関数がアクセスできるのは,クラスの静的データメンバーだけです。
C の場合
- ポインタは,整数型または別のポインタにキャストできます。
- 整数型は,任意の整数型,浮動小数点型,またはポインタ型にキャストできます。
- 浮動小数点型は,整数型または浮動小数点型にキャストできます。
構造体や配列から,または構造体や配列にキャストすることはできません。
通常,void 型からはキャストできません。
C++ の場合
ユーザー定義の変換とコンストラクタがないかがチェックされます。見つからない場合は,前述の規則が適用されます(クラスメンバーへのポインタを除く)。
整数型では,定数 0 だけをメンバーポインタにキャストできます。
メンバーポインタは,整数型または類似のメンバーポインタにキャストできます。
元のメンバーポインタがデータメンバー(または関数)を指す場合,類似のメンバーポインタもデータメンバー(または関数)を指します。キャスト先の型の修飾クラスは,キャスト元の型と同じ(またはキャスト元の型の基本クラス)である必要があります。