使用谓词和 Array::FindAll() 编译 C++/CLI 委托调用时出错
以下代码导致 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 C++/CLI 中,您必须传递包含该函数的类型的实际实例:(
或使您的
IsEven
方法static
)In C++/CLI you have to pass the actual instance of the type containing the function:
(or make your
IsEven
methodstatic
)以下简单的控制台应用程序提供了 .NET C++/CLI 中带有
array
的FindAll()
方法的示例。这适用于不提供 lambda 支持的 Visual Studio 2005。 由于您的示例使用 Windows 窗体,因此我在此 Windows 控制台应用程序中提供了一个额外的类,以在
FindAll()
中使用时显示类中的Predicate
函数。此示例显示了提供谓词的三种不同机制:
这是一个非常基本的方法使用
int
进行示例,但它也可以处理更复杂的数据结构。该程序的输出如下所示:
The following simple console application provides examples of the
FindAll()
method with anarray
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 theFindAll()
.This example shows three different mechanisms for providing a predicate:
This is a very basic sample using
int
however it does also work with more complex data structures as well.The output from this program looks like the following: