我的课程定义如下:
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
来封装图片框的界面。这是正确的方法吗?有任何建议如何解决这个错误?
答案 0 :(得分:2)
你唯一的错误就是你试图以一种不起作用的方式混合托管和非托管C ++ / CLI代码(并且没有意义)。
.NET委托已经绑定了第一个参数。您所需要的只是:
class1->setPic2Click(gcnew System::EventHandler(this, &Form1::pic2_Click));
和
void setPic2Click(System::EventHandler^ op) {pic2->Click += op;}