Errore durante la compilazione della chiamata del delegato C ++ / CLI utilizzando Predicate with Array :: FindAll ()
-
19-08-2019 - |
Domanda
Il codice seguente genera C3867 (... elenco di argomenti mancanti della chiamata di funzione ...) e C3350 (... un costruttore delegato prevede 2 argomenti ...). Cosa sto sbagliando?
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));
}
};
Soluzione
In C ++ / CLI è necessario passare l'istanza effettiva del tipo contenente la funzione:
array<int> ^even = Array::FindAll(
numbers, gcnew Predicate<int>(this, &Test::IsEven));
(o rendi il tuo IsEven
metodo statico
)
Altri suggerimenti
La seguente semplice applicazione console fornisce esempi del metodo FindAll ()
con un array
in .NET C ++ / CLI.
Funziona con Visual Studio 2005 che non fornisce supporto per lambdas. Poiché il tuo esempio utilizza Windows Form, fornisco una classe aggiuntiva in questa applicazione console Windows per mostrare la funzione Predicate
da una classe quando viene utilizzata in FindAll ()
.
Questo esempio mostra tre diversi meccanismi per fornire un predicato:
- utilizzando una funzione statica di classe disponibile senza un oggetto
- utilizzando un metodo di classe che richiede la creazione di un oggetto prima di utilizzare
- una semplice funzione in stile C che non è un metodo in una classe
Questo è un esempio molto semplice usando int
, ma funziona anche con strutture di dati più complesse.
// _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;
}
L'output di questo programma è simile al seguente:
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