не может получить адрес функции, если не создан экземпляр делегата - PullRequest
0 голосов
/ 01 мая 2011

У меня есть класс, определенный ниже:

ref class myClass
{
    PictureBox^ pic2;
public:
    void setPic2() { pic2 = gcnew PictureBox; }

    template<typename UnaryOperator>
    void setPic2Click(Form^ x, UnaryOperator op) { pic2->Click += gcnew EventHandler(x, op); }
};

И в моем классе Windows формы:

namespace testProject 
{
    public ref class Form1 : public System::Windows::Forms::Form
    {
        void Form1_Load(Object^ sender, EventArgs^ e)
        {
            rect1.setPic2(); 
            rect1.setPic2Click(this, std::bind1st(std::mem_fun(&Form1::pic2_Click), this));
        }

        void pic2_Click(Object^ sender, EventArgs^ e)
        {
            // do something...
        }

При компиляции генерируется эта ошибка, связанная с вызовом rect1.setPic2Click ...:

ошибка C3374: невозможно получить адрес 'testProject::Form1::pic2_Click', если не создан экземпляр делегата

По сути, я попытался инкапсулировать интерфейс Picturebox, создав метод экземпляра setPic2Click. Это правильный подход? Любое предложение, как исправить эту ошибку?

1 Ответ

2 голосов
/ 01 мая 2011

Ваша единственная ошибка в том, что вы пытаетесь смешать управляемый и неуправляемый код C ++ / CLI так, чтобы это не работало (и не имело смысла).

.NET-делегаты уже имеютсвязанный первый параметр.Все, что вам нужно:

class1->setPic2Click(gcnew System::EventHandler(this, &Form1::pic2_Click));

и

void setPic2Click(System::EventHandler^ op) {pic2->Click += op;}
...