7

次のコードは、C3867 (...関数呼び出しに引数リストがありません...) および C3350 (...デリゲート コンストラクターは 2 つの引数を予期しています...) になります。私は何を間違っていますか?

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        bool IsEven(int i){
            return (i % 2) == 0;
        }

        Form1(void)
        {
            numbers = gcnew array<int>{
                1, 2, 3, 4, 5, 6, 7, 8, 9, 10
            };

            array<int> ^even = Array::FindAll(
                numbers, gcnew Predicate<int>(IsEven));
        }
    };
4

2 に答える 2

13

C ++ / CLIでは、関数を含む型の実際のインスタンスを渡す必要があります。

 array<int> ^even = Array::FindAll(
    numbers, gcnew Predicate<int>(this, &Test::IsEven));

(またはIsEvenメソッドを作成しますstatic

于 2009-03-16T08:48:54.577 に答える
0

次の単純なコンソール アプリケーションは、.NET C++/CLIFindAll()を使用したメソッドの例を示しています。array

これは、ラムダをサポートしていない Visual Studio 2005 で機能します。あなたの例では Windows フォームを使用しているため、この Windows コンソール アプリケーションで追加のクラスを提供しPredicateて、FindAll().

この例は、述語を提供するための 3 つの異なるメカニズムを示しています。

  • オブジェクトなしで利用可能なクラス静的関数を使用する
  • 使用する前にオブジェクトを作成する必要があるクラスメソッドを使用する
  • クラスのメソッドではない単純な C スタイルの関数

これは使用する非常に基本的なサンプルですが、intより複雑なデータ構造でも機能します。

// _scrap_net.cpp : main project file.

#include "stdafx.h"

using namespace System;

    public ref class Thing1
    {
    private:
        int     iDiv;                  // divisor if specified
    public:
        static bool IsEven(int i){      // static usable without creating an object
            return (i % 2) == 0;        // even number if division has no remainder
        }
        static bool IsOdd(int i){       // static usable without creating an object
            return (i % 2) != 0;        // odd numbered if division has remainder
        }
        bool IsDivisibleBy (int i) {    // non-static must create object before using
            return (i % iDiv) == 0;     // check if division has remainder
        }
        bool IsNotDivisibleBy (int i) { // non-static must create object before using
            return (i % iDiv) != 0;     // check if division has remainder
        }

        Thing1(void) { iDiv = 2; }      // standard constructor
        Thing1(int i) { iDiv = i; }     // constructor with argument to use IsDivisibleBy()
    };

    // standalone function used rather than a class function
    bool IsLessThan10 (int i) {
        return i < 10;
    }

int main(array<System::String ^> ^args)
{
    // sample array of some integers for our example
    array<int> ^numbers = gcnew array<int>{
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
    };

    // our format string to use when printing the array values
    String ^ fmt = gcnew String(L" {0,6}");

    // use a static function in a class as the predicate so object not needed
    array<int> ^even = Array::FindAll(numbers, gcnew Predicate<int>(&Thing1::IsEven));

    Console::WriteLine (L"\n even ");
    for each (int jj in even) {
        Console::Write(fmt, jj);
    }

    // use a standard function as the predicate so class not needed
    array<int> ^lessThan10 = Array::FindAll(numbers, gcnew Predicate<int>(&IsLessThan10));

    Console::WriteLine (L"\n lessThan10 ");
    for each (int jj in lessThan10) {
        Console::Write(fmt, jj);
    }


    // use a special divisor so create an object with that value and use it.
    Thing1 ^ myDiv = gcnew Thing1(3);

    // need to specify the object for the object method in the predicate
    array<int> ^divBy3 = Array::FindAll(numbers, gcnew Predicate<int>(myDiv, &Thing1::IsDivisibleBy));

    Console::WriteLine (L"\n divBy3 ");
    for each (int jj in divBy3) {
        Console::Write(fmt, jj);
    }


    // need to specify the object for the object method in the predicate
    array<int> ^notDivBy3 = Array::FindAll(numbers, gcnew Predicate<int>(myDiv, &Thing1::IsNotDivisibleBy));

    Console::WriteLine (L"\n notDivBy3 ");
    for each (int jj in notDivBy3) {
        Console::Write(fmt, jj);
    }

    Console::WriteLine (L"\nEnd");
    return 0;
}

このプログラムの出力は次のようになります。

 even
      2      4      6      8     10     12     14
 lessThan10
      1      2      3      4      5      6      7      8      9
 divBy3
      3      6      9     12
 notDivBy3
      1      2      4      5      7      8     10     11     13     14
End
于 2015-06-29T05:15:10.827 に答える