2009-03-16 11 views
6

Il codice seguente restituisce C3867 (... chiamata di funzione elenco di argomenti mancante ...) e C3350 (... un costruttore delegato richiede 2 argomenti (S)...). Che cosa sto facendo di sbagliato?Errore durante la compilazione di C++/CLI Delegate la chiamata utilizzando Predicate con Array :: FindAll()

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

risposta

11

In C++/CLI si deve passare l'istanza effettiva del tipo che contiene la funzione:

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

(o fare il vostro metodo di IsEvenstatic)

+0

E ho anche dimenticato la e commerciale. Grazie. –

0

La seguente applicazione di console semplice fornisce esempi del metodo FindAll() con uno array in .NET C++/CLI.

Questo funziona con Visual Studio 2005 che non fornisce supporto per lambda. Poiché il tuo esempio utilizza Windows Form, fornisco una classe extra in questa applicazione per 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 classe disponibile senza oggetto
  • utilizzando un metodo di classe che richiede un oggetto da creare prima di utilizzare
  • un semplice Funzione stile C che non è un metodo in una classe

Questo è un campione molto semplice che utilizza int tuttavia anche w anche con strutture 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 si presenta come il 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 
Problemi correlati