2009-03-16 7 views
6

Le code suivant a pour résultat C3867 (... appel de fonction manquant liste d'arguments ...) et C3350 (... un constructeur délégué attend 2 arguments (s) ...). Qu'est-ce que je fais mal?Erreur lors de la compilation de l'appel de délégué C++/CLI à l'aide de Predicate avec 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)); 
     } 
    }; 

Répondre

11

En C++/CLI, vous devez passer l'instance réelle du type contenant la fonction:

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

(ou rendre votre méthode IsEvenstatic)

+0

Et je aussi oublié l'esperluette. Merci. –

0

La simple application de la console suivante fournit exemples de la méthode FindAll() avec un array dans .NET C++/CLI.

Cela fonctionne avec Visual Studio 2005 qui ne prend pas en charge lambdas. Comme votre exemple utilise Windows Forms, je fournis une classe supplémentaire dans cette application de console Windows pour afficher la fonction Predicate d'une classe lorsqu'elle est utilisée dans le FindAll().

Cet exemple montre trois mécanismes différents pour fournir un prédicat:

  • en utilisant une fonction statique de classe disponible sans objet
  • en utilisant une méthode de classe qui nécessite un objet être créé avant d'utiliser
  • simple Fonction de style C qui n'est pas une méthode dans une classe

Ceci est un exemple très basique utilisant int mais il ork avec des structures de données plus complexes.

// _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 sortie de ce programme se présente comme suit:

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 
Questions connexes