1

私はカスタムコントロールを含むdllを構築するために使用される2つのクラスResizeLabelとResizePanelを持つヘッダーファイル 'Custom.h'を持っています。私はResizeLabel内のカスタム:: ResizePanelを使用する場合、それは失敗している:同じName.hファイルのName :: Class2のName :: Class1の使用は失敗します

error C2039: 'ResizePanel' : is not a member of 'Custom' 

Errorlistに警告もあります:

Exception of type 'System.Exception' was thrown 

私は警告が関連していることを想像してみてください。 Visual Studioがカスタム:: ResizePanelを含むDLLをコンパイルしているコードからロードしようとしている可能性がありますか?次のように

コードは次のとおりです。

namespace Custom { 

public ref class ResizeLabel : public System::Windows::Forms::Label 
{ 
protected: virtual void OnTextChanged(System::EventArgs^ e) override { 
      __super::OnTextChanged(e); 
      // Not elegant I know, 
      // but this is just to force the panel to process the size change 
      dynamic_cast<Custom::ResizePanel^>(this->Parent)->CurrentWidth = 0; 
     } 
    ... 
    }; 
public ref class ResizePanel : public System::Windows::Forms::Panel 
{ ... }; 
} 

私はちょうど報告されたエラーの数を減らすために、それはdynamic_castました。

この問題を回避するにはどうすればよいですか?

答えて

2

これは古典的なC++の動作です。最初にC++の基礎を学ぶことなくC++/CLIを学ぶことは非常に難しいでしょう。

この作業であるようにする一般的なパターン:

  • フォワードはタイプ
  • を宣言型
  • を定義するために

型メンバ関数を定義します。

例えば

:あなたが正しいかもしれない

ref class ResizeLabel; 
ref class ResizePanel; 

public ref class ResizeLabel : public System::Windows::Forms::Label 
{ 
protected: 
    virtual void OnTextChanged(System::EventArgs^ e) override; 
    ... 
}; 

public ref class ResizePanel : public System::Windows::Forms::Panel 
{ 
    ... 
}; 

void ResizeLabel::OnTextChanged(System::EventArgs^ e) 
{ 
    __super::OnTextChanged(e); 
    // Not elegant I know, 
    // but this is just to force the panel to process the size change 
    dynamic_cast<Custom::ResizePanel^>(this->Parent)->CurrentWidth = 0; 
} 
+0

原則的に正しいですが、クラス外のオーバーライドへのコンパイラオブジェクト – bobinski

+0

間違った入力を押しました - この複数行のボックスが次の行に移動することを期待していました!私はこれよりも優れたコンパイラに慣れています。ファイルを2回解析する必要があります。最後の関数は 'void ResizeLabel :: OnTextChanged(System :: EventArgs^e)を読み込む必要があります。 { __super :: OnTextChanged(e); //私が知っているエレガントではない //これは、パネルがサイズ変更を処理するように強制することです。 dynamic_cast (this-> Parent) - > CurrentWidth = 0; } ' – bobinski

+0

ありがとう@bobinski、fixed –

0

ResizePanelが名前空間にまだ表示されていないため、コンパイルエラーです。コンパイラは、後でそれを追加することを認識しません。おそらくあなたは注文を変更することができますか?

ResizeLabelオブジェクトもResizePanelでない場合、dynamic_castが失敗する可能性があります。それは同時に両方のことができますか?

+0

。残念ながら私は両方向からの参照が必要です。私はすでにResizePanelからResizeLabelへの参照を使用しています。私はエラーを交換していると思う。 – bobinski

関連する問題