2013-04-12 4 views
1

Я пытаюсь сделать сортировку делегата в C++/CLI, но, когда я пытаюсь скомпилировать я Получать эту ERRO:сделать сортировку по делегирует

>app.cpp(256): error C3374: can't take address of 'Program::AnonymousMethod1' unless creating delegate instance 
>app.cpp(256): error C2664: 'void System::Collections::Generic::List<T>::Sort(System::Comparison<T> ^)' : cannot convert parameter 1 from 'System::Object ^(__clrcall *)(Program::teste1,Program::teste1)' to 'System::Comparison<T> ^' 
>   with 
>   [ 
>    T=Program::teste1^
>   ] 
>   No user-defined-conversion operator available, or 
>   There is no context in which this conversion is possible 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

здесь пример кода ошибки:

using namespace System; 
using namespace System::Collections::Generic; 

private ref class Program 
{ 
private: 
    enum class tokens 
    { 
     teste, 
     lala, 
     blabla, 
    }; 

    ref struct teste1 
    { 
     int linha; 
     tokens tk; 
    }; 

private: 
    static Object ^AnonymousMethod1(teste1 p1, teste1 p2) 
    { 
     return p1.tk.CompareTo(p2.tk); 
    } 

public: 
    Program() 
    { 
     bool jump = false; 
     List<teste1^>^ lstTest = gcnew List<teste1^>(); 
     Random ^rnd = gcnew Random(); 

     for (int i = 0; i < 20; i++) 
     { 
      teste1 ^tst = gcnew teste1(); 
      switch (rnd->Next(1,4)) 
      { 
      case 1: 
       tst->tk = tokens::teste; 
       break; 
      case 2: 
       tst->tk = tokens::lala; 
       break; 
      case 3: 
       tst->tk = tokens::blabla; 
       break; 
      } 
      lstTest->Add(tst); 
     } 

     for each (teste1^ content in lstTest) 
     { 
      Console::WriteLine(content->tk.ToString()); 
     } 

     lstTest->Sort(AnonymousMethod1); 

     Console::WriteLine("=============================================================="); 

     for each (teste1^ content in lstTest) 
     { 
      Console::WriteLine(content->tk.ToString()); 
     } 
    } 
}; 

int main(array<String^> ^args) 
{ 
    Program^ prg = gcnew Program(); 
    return 0; 
} 

Я просто хочу сортировать список с маркером 'lala' во-первых, как я могу это сделать, и, как я могу это решить ???

ответ

2

Ваш список имеет тип List<test1^> (обратите внимание на шляпу ^). Итак, нужный Comparison<T> делегат - Comparison<teste1^>. Таким образом, вы хотите изменить свою AnonymousMethod1 следующим образом:

static int AnonymousMethod1(teste1^p1, teste1^p2) 
{ 
    return p1->tk.CompareTo(p2->tk); 
} 

И в C++/CLI вам нужно явно создать делегат:

Comparison<teste1 ^>^comparisonDelegate = gcnew Comparison<teste1 ^>(&AnonymousMethod1); 
    lstTest->Sort(comparisonDelegate); 
Смежные вопросы