Make sort using delegates

跟風遠走 提交于 2019-12-24 13:00:03

问题


I'm try to make a sort delegate in C++/CLI, but, when I try to compile I recive this 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 ==========

here is the code sample of the error:

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

I just whant to sort the list with the token 'lala' first, how I can make this, and, How I can solve this ???


回答1:


Your List is of type List<test1^> (notice the ^ hat). So the Comparison<T> delegate you want is Comparison<teste1^>. Thus you'll want to change your AnonymousMethod1 as follows:

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

And in C++/CLI you need to explicitly create your delegate:

    Comparison<teste1 ^> ^ comparisonDelegate = gcnew Comparison<teste1 ^>(&AnonymousMethod1);
    lstTest->Sort(comparisonDelegate);


来源:https://stackoverflow.com/questions/15974252/make-sort-using-delegates

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!