خطأ تجميع C ++/CLI Calling باستخدام المسند مع Array :: Findall ()
-
19-08-2019 - |
سؤال
ينتج عن الرمز التالي في 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));
}
};
المحلول
في C ++/CLI ، يجب عليك تمرير المثيل الفعلي للنوع الذي يحتوي على الوظيفة:
array<int> ^even = Array::FindAll(
numbers, gcnew Predicate<int>(this, &Test::IsEven));
(أو اجعل IsEven
طريقة static
)
نصائح أخرى
يوفر تطبيق وحدة التحكم البسيطة التالية أمثلة على FindAll()
طريقة مع array
في .NET C ++/CLI.
هذا يعمل مع Visual Studio 2005 والذي لا يوفر الدعم لـ Lambdas. نظرًا لأن مثالك يستخدم نماذج Windows ، أقدم فئة إضافية في تطبيق Windows Console لإظهار ملف Predicate
الوظيفة من فئة عند استخدامها في FindAll()
.
يوضح هذا المثال ثلاث آليات مختلفة لتوفير مسند:
- استخدام وظيفة ثابتة فئة متاحة بدون كائن
- استخدام طريقة فئة تتطلب إنشاء كائن قبل الاستخدام
- وظيفة نمط 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