0

環境

Visual Studio 2013 および C++/CLI。

(ho/e)エラー

IntelliSense がコンパイラ準拠の行でエラーを出す状況に直面しました。したがって、偽陽性。

エラーは次のとおりです。

IntelliSense: 関数 "< 完全修飾メソッド名 >" は、指定された引数リストで呼び出すことはできません
引数の型:
< 予想される引数の型 >
オブジェクトの型:
< オブジェクトの型 >

どうしたの

ユーザーコントロールを作成しました。そこで、相対デリゲートを使用してカスタム イベントを宣言しました。フォームを作成しました。フォーム コンストラクターで、ユーザー コントロール インスタンスを割り当て、フォーム メソッドをコントロール カスタム イベントにアタッチしようとします。

コンパイラは、すべて問題ないと言っています。IntelliSense は、イベントの添付ファイルの型が一致しないことを教えてくれます。

再現方法

問題を掘り下げ、問題を再現する必要のあるコンテキストを作成しました。

  1. FavaTest(ClassLibrary として) とFavaForm(コンソール アプリケーションとして)の 2 つのプロジェクトでソリューションを作成します。
  2. FavaTest名前が の UserControl を作成しFavaClass、以下を に貼り付けますFavaClass.h
    #pragma once

    名前空間システムの使用;
    名前空間 System::ComponentModel を使用します。
    名前空間 System::Collections を使用します。
    名前空間 System::Windows::Forms を使用します。
    名前空間 System::Data を使用します。
    名前空間 System::Drawing を使用します。


    名前空間 FavaTest {

        public ref class FavaClass : public System::Windows::Forms::UserControl
        {
        公衆:
            FavaClass(void)
            {
                InitializeComponent();
            }

            // -- ここでは非常に単純なイベントを定義します --
            デリゲート void FavaDelegate();
            イベント FavaDelegate^ FavaEvent;

        保護:
            〜FavaClass()
            {
                if (コンポーネント)
                {
                    コンポーネントを削除します。
                }
            }

        プライベート:
            システム::ComponentModel::コンテナ ^components;

    #pragma region Windows フォーム デザイナーで生成されたコード
            void InitializeComponent(void)
            {
                this->SuspendLayout();
                ///
                // FavaClass
                ///
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                this->Name = L"FavaClass";
                this->Size = System::Drawing::Size(249, 147);
                this->ResumeLayout(false);

            }
    #pragma endregion
        };
    }

  1. プロジェクトFavaFormで、名前が のフォームを作成しLaForm、以下を貼り付けますLaForm.h
    名前空間 FavaForm {

        名前空間システムの使用;
        名前空間 System::ComponentModel を使用します。
        名前空間 System::Collections を使用します。
        名前空間 System::Windows::Forms を使用します。
        名前空間 System::Data を使用します。
        名前空間 System::Drawing を使用します。

        public ref class LaForm : public System::Windows::Forms::Form
        {
        公衆:
            LaForm(ボイド)
            {
                InitializeComponent();

                // ここでは単純に FavaClass オブジェクトを割り当て、FavaEvent イベントにアタッチしようとします
                FavaTest::FavaClass ^item = gcnew FavaTest::FavaClass();
                item->FavaEvent += gcnew FavaTest::FavaClass::FavaDelegate(this, &LaForm::onfava);
            }

            void onfava(){}

        保護:
            〜LaForm()
            {
                if (コンポーネント)
                {
                    コンポーネントを削除します。
                }
            }
        プライベート:
            システム::ComponentModel::コンテナ ^components;

    #pragma region Windows フォーム デザイナーで生成されたコード
            void InitializeComponent(void)
            {
                this->SuspendLayout();
                ///
                // ラフォーム
                ///
                this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
                this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
                this->ClientSize = System::Drawing::Size(368, 261);
                this->Name = L"LaForm";
                this->Text = L"LaForm";
                this->ResumeLayout(false);

            }
    #pragma endregion
        };
    }

  1. 建てるFavaTest
  2. FavaFormプロジェクトで、生成された dll を依存関係として使用するためにcommon properties、新しい参照を追加します。FavaTest
  3. ビルド ソリューション。

これで、コンパイラはすべて正常であることを通知しますが、IntelliSense がイベントの添付行に次のようなエラー メッセージを表示していることがわかります。

IntelliSense: 関数 "FavaTest::FavaClass::FavaEvent::add" は、指定された引数リストで呼び出すことはできません
    引数の型は:
(FavaTest::FavaClass::FavaDelegate ^)
    オブジェクトの型は: FavaTest::FavaClass ^

すぐに実行できるパッケージ

解凍して実行できるようにするために、これらすべてをside-test-standalone-solution zipファイルにパッケージ化しましたが、残念ながら(IMHOも疑わしい)SEのガイドラインのためにここに投稿できないため、作成するのはあなた次第です上記によるデバッグコンテキスト。

質問

何かが欠けている可能性もありますが、以前にこのアルゴリズムを数回使用しましたが、完全に機能しました。現在、2 つの異なるマシン (VS2013 と VS2015) でこれを経験しています。このエラーはあなたにも当てはまりますか? IntelliSense の何が問題なのですか? 私だけが経験しているとは思えないほど単純なシナリオです。しかし、私はインターネット上で手がかりを見つけませんでした。

4

1 に答える 1

0

解決しました。

IntelliSense が狂わないようにするには、デリゲートの定義をイベントの親クラスのスコープ外にする必要があることがわかりました。したがって、私の状況では、(IntelliSense の場合) 正しく処理するために必要なことは、デリゲートをクラスの外に移動してpublic、次のようなキーワードを追加することだけでした。

namespace FavaTest
{

    public delegate void FavaDelegate();    // moved out of the class with "public"

    public ref class FavaClass : public System::Windows::Forms::UserControl
    {
        public:
            [...]

            // -- here defines very simple event --
            // delegate row away from here
            event FavaDelegate^ FavaEvent;

            [...]
    }
}
于 2015-10-30T09:24:06.780 に答える