除非创建委托实例,否则不能获取函数的地址

时间:2011-05-01 01:03:46

标签: visual-c++ c++-cli pass-by-reference

我的课程定义如下:

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'的地址

基本上,我尝试通过创建实例方法setPic2Click来封装图片框的界面。这是正确的方法吗?有任何建议如何解决这个错误?

1 个答案:

答案 0 :(得分:2)

你唯一的错误就是你试图以一种不起作用的方式混合托管和非托管C ++ / CLI代码(并且没有意义)。

.NET委托已经绑定了第一个参数。您所需要的只是:

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

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