使用谓词和 Array::FindAll() 编译 C++/CLI 委托调用时出错

发布于 2024-07-15 01:34:42 字数 529 浏览 5 评论 0原文

以下代码导致 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));
        }
    };

The following code results in C3867 (...function call missing argument list...) and C3350 (...a delegate constructor expects 2 argument(s)...). What am I doing wrong?

    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));
        }
    };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

2024-07-22 01:34:42

在 C++/CLI 中,您必须传递包含该函数的类型的实际实例:(

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

或使您的 IsEven 方法 static

In C++/CLI you have to pass the actual instance of the type containing the function:

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

(or make your IsEven method static)

送舟行 2024-07-22 01:34:42

以下简单的控制台应用程序提供了 .NET C++/CLI 中带有 arrayFindAll() 方法的示例。

这适用于不提供 lambda 支持的 Visual Studio 2005。 由于您的示例使用 Windows 窗体,因此我在此 Windows 控制台应用程序中提供了一个额外的类,以在 FindAll() 中使用时显示类中的 Predicate 函数。

此示例显示了提供谓词的三种不同机制:

  • 使用无需对象即可使用的类静态函数
  • 之前创建一个对象
  • 使用类方法,这需要在使用简单的 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

The following simple console application provides examples of the FindAll() method with an array in .NET C++/CLI.

This works with Visual Studio 2005 which does not provide support for lambdas. Since your example is using Windows Forms, I provide an extra class in this Windows console application to show the Predicate function from a class when used in the FindAll().

This example shows three different mechanisms for providing a predicate:

  • using a class static function available without an object
  • using a class method which requires an object be created before using
  • a simple C style function which is not a method in a class

This is a very basic sample using int however it does also work with more complex data structures as well.

// _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;
}

The output from this program looks like the following:

 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文