2

using namespaceWindows フォーム プロジェクトでを利用して、コーディング時間を節約しようとしています。VS2010 で C++/CLI を使用して既定の Windows フォーム プロジェクトを作成しました。インポートされるデフォルトの名前空間は次のとおりです。

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

DialogResult型付きの変数を作成したいと考えています。これは (便利なことに十分です!)System::Windows::Forms名前空間内に配置されます。デフォルトのコンストラクターに入り、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

1 に答える 1

5

System::Windows::Forms::Formには という名前のプロパティがあるDialogResultため、サブクラス内では、Formそのプロパティはグローバル名前空間の型よりも優先されます。

私は通常、typedef を使用してこれを回避します。

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

次に、タイプを使用する必要があるときはいつでも を使用しDialogResult_t、プロパティにアクセスする必要があるときはいつでも を使用しますDialogResult

この問題は C++/CLI 固有のものではないことに注意してください。C++ には同じスコープ規則があり、その結果、同じ問題が発生する可能性があります。C#にはこの問題がないため、.NET BCL は型名をプロパティ名として非常に広範囲に再利用します (C++ コードではそれを回避します) 。

于 2012-04-04T16:59:07.707 に答える