4


0

コンパイル時エラーC4407

コードには次のクラス構造があります

Class A: public CDialog, public Base1, public Base2
{
};

クラスAの実装には、次のものがあります。

BEGIN_MESSAGE_MAP( A, CDialog )
    ON_WM_SIZE()
END_MESSAGE_MAP()

Base1とBase2はCDialogまたは他のMFCクラスから継承しないことに注意してください。

VC6では、コンパイルは成功します。 しかし、VC9では次のエラーコードが表示されます。

エラーC4407:メンバ表現への異なるポインタ間でキャストすると、コンパイラが不正なコードを生成する可能性があります

このエラーコードは、ON_WM_SIZEの場所を指しています。

誰かが解決策を教えてもらえますか。 前もって感謝します。

ゲーマー

4 Answer


5


この問題のインスタンスを解決しました。ウェブ検索でこの質問を見つけました。

私の場合、複数のクラスCDialogとConfigurationTabを継承するダイアログクラスもありました。これは内部インターフェイスです。 コンパイラの警告は、次の変更により沈黙しました。

class Foo : public ConfigurationTab, public CDialog

と:

class Foo : public CDialog, public ConfigurationTab

この状況は、問題のダイアログがDDX変数への割り当て時にON_BN_CLICKEDメソッド内でクラッシュしたときに発見されました。 DDX変数は、初期化されていることが確認されたときに、その行で不思議なほど初期化されていませんでした。


2


便利なV9をインストールしていませんが、VS6とVC8の間で、ON_WM_SIZE定義が意味的に同じに変更されましたが、受け入れられるものははるかに厳しくなりました。 VC6はCキャストを使用しましたが、VC8はより多くの問題をキャッチするC ++キャストを使用しています。

OnSizeメソッドのクラスからの実際の宣言を確認する必要があります。ここで何が間違っているのかを判断できると思います。


1


推測すると、MFCをやってからしばらく経ちましたが、多重継承が混乱しているようです

BEGIN_MESSAGE_MAP(class、baseclass)

は、「クラス」のメソッドの呼び出しに展開されます。したがって、Aは複数を継承するため、どれを使用するかが不確かなので、いくつかの基本クラスで同じメソッドを使用している可能性があります。


0


私の場合、Base2クラスには仮想メソッドがあります。 eg.

class Base2
{
 virtual void method(){};
}

私が使用すると警告が発生します

Class A: public CDialog, public Base1, public virtual Base2
{
};

クラスAを定義する

ここで仮想キーワードを削除した場合。

Class A: public CDialog, public Base1, public Base2
{
};

その後、警告が消えました。 Base2の本体からvirtualを削除しなかったことに注意してください。 クラスAの定義でのみ。

お役に立てば幸いです。