2009-03-16 8 views
6

El siguiente código da como resultado C3867 (... lista de argumentos perdidos de llamada de función ...) y C3350 (... un constructor delegado espera 2 argumentos (s) ...). ¿Qué estoy haciendo mal?Error al compilar llamada de delegado de C++/CLI usando 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)); 
     } 
    }; 

Respuesta

11

En C++/CLI usted tiene que pasar la instancia actual de la clase que contiene la función:

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

(o hacer su método IsEvenstatic)

+0

Y también se me olvidó el símbolo de unión. Gracias. –

0

La siguiente aplicación de consola sencilla proporciona una ejemplos del método FindAll() con un array en .NET C++/CLI.

Esto funciona con Visual Studio 2005 que no proporciona soporte para lambdas. Como su ejemplo usa Windows Forms, proporciono una clase adicional en esta aplicación de consola de Windows para mostrar la función Predicate de una clase cuando se usa en el FindAll().

Este ejemplo muestra tres mecanismos diferentes para proporcionar un predicado:

  • utilizando una función estática clase disponible sin un objeto
  • usando un método de la clase que requiere un objeto ser creado antes de usar
  • un simple Función de estilo C que no es un método en una clase

Esta es una muestra muy básica que usa int pero también w ork con estructuras de datos más complejas también.

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

La salida de este programa tiene el siguiente aspecto:

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 
Cuestiones relacionadas