2012-04-04 7 views
2

Windows Formsプロジェクトでusing namespaceを利用することで、コーディング時間を節約しようとしています。 VS2010でC++/CLIを使用してデフォルトのWindowsフォームプロジェクトを作成しました。WindowsフォームアプリケーションでC++/CLIを使用した名前空間の混乱

using namespace System; 
using namespace System::ComponentModel; 
using namespace System::Collections; 
using namespace System::Windows::Forms; 
using namespace System::Data; 
using namespace System::Drawing; 

は私がSystem::Windows::Forms名前空間内で座っている(!便利に十分な)DialogResult -typed変数を作成したい:私は、インポートされ、デフォルトの名前空間があることに注意してください。私はデフォルトForm1のコンストラクタに移動して行を追加します。

DialogResult dr; 

私はコンパイルエラーsyntax error : missing ';' before identifier 'dr'を取得します。しかし

、私はラインを変更した場合に、次のいずれか

Windows::Forms::DialogResult dr; 

または

System::Windows::Forms::DialogResult dr; 

その後、すべてが期待通りに動作します。

私は、あまりにも動作します

using namespace System::Windows; 

、その後

Forms::DialogResult dr 
を追加してみました!

これらの名前空間がどのように機能しているのか見当たりません。私が書いているすべてのコードを完全に修飾する必要はありませんが、必要な名前空間がすでにインポートされているので間違っていることがわかりません。

答えて

4

System::Windows::Forms::Formは、DialogResultという名前のプロパティを持っています。したがって、このプロパティのサブクラスは、グローバル名前空間のタイプよりもスコープ優先順位を持っています。

I通常のtypedefでこれを回避する:次に

typedef System::Windows::Forms::DialogResult DialogResult_t; 

あなたはタイプを使用する必要がある任意の時間、DialogResult_tを使用して、あなたがプロパティにアクセスする必要がある時は、DialogResultを使用しています。この問題は、C++/CLIの特定– C++は、同じスコープルールを持ち、その結果、同じ問題を抱えてしまうではないことを

注意。 C#にはこの問題がないため、.NET BCLはプロパティ名として型名をかなり広範囲に再利用しています(C++コードではそれを避ける)。

+0

Grr!私はこの1つを分かったはずですが、大きな説明と役に立つアドバイス!どうもありがとう! – aardvarkk

関連する問題