none
如何在VS2012中使用 C++.net Action RRS feed

  • 问题

  • 我需要在C++.net中使用System::Action,并且完全按照 http://msdn.microsoft.com/zh-cn/library/018hxwa8%28v=vs.110%29.aspx

    上面的方法使用。

    现在的问题是:我在SomeObject中定义DoSomeThing()方法,然后创建someObject实例,

    auto cmd=gcnew System::Action(&someObject->DoSomeThing);

    结果编译时报错:error C2276: “&”: 绑定成员函数表达式上的非法操作  

    使用方法和示例是一样的,所以,问题出在哪里呢?

    2013年11月30日 3:45

答案

  • 谢谢,不过,问题好像不太一样。我之前做C#,没有C++方面的经验。刚才又看了一下Action的示例,里面的方法是静态方法

    auto cmd = gcnew System::Action(&SomeClass::DoSomeThing) ,当DoSomeThing为静态方法时,这种方式是正确的。

    而我给System::Action传的参数是一个对象的方法

    正确的写法是这样:gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    而现在有个小问题:当我使用cmd()时,鼠标移动到“cmd()”时,编译器提示:“Error:无法使用给定参数调用函数“System::Action::Invoke””,但是运行却没问题,方法也能正常调用。

    2013年12月2日 8:05
  • 补充一下:

    auto cmd = gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    其中DoSomeThing没有参数也没有返回值

    而我使用有参数的DoSomeThing时,

    auto cmd = gcnew System::Action<参数类型^>gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    调用cmd(参数),编译器就不提示错误了,运行同样正常

    2013年12月2日 8:10

全部回复

  • 你好,

    此问题可能是由于在Action<t>委托 中定义的参数类型不当引起的。

    请注意在上述链接中的备注:

    “可以使用 Action(T) 委托以参数形式传递方法,而不用显式声明自定义的委托。封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。(在 C# 中,该方法必须返回 void Visual Basic 中,必须通过 SubEnd Sub 结构来定义它。 它也可以是返回已忽略的值的方法。) 通常,这种方法用于执行某个操作。

    下面是一些供参考的相关链接:

    编译器错误 C2276

    托管类类型的声明

    CLR 引用类对象的声明

    如果问题仍未从上面的链接中得到解决,请再次张贴相关的代码样例或者上传至 https://skydrive.live.com/ 以便这里可以重现。

    感谢你对本论坛的支持。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2013年12月2日 2:31
    版主
  • 谢谢,不过,问题好像不太一样。我之前做C#,没有C++方面的经验。刚才又看了一下Action的示例,里面的方法是静态方法

    auto cmd = gcnew System::Action(&SomeClass::DoSomeThing) ,当DoSomeThing为静态方法时,这种方式是正确的。

    而我给System::Action传的参数是一个对象的方法

    正确的写法是这样:gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    而现在有个小问题:当我使用cmd()时,鼠标移动到“cmd()”时,编译器提示:“Error:无法使用给定参数调用函数“System::Action::Invoke””,但是运行却没问题,方法也能正常调用。

    2013年12月2日 8:05
  • 补充一下:

    auto cmd = gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    其中DoSomeThing没有参数也没有返回值

    而我使用有参数的DoSomeThing时,

    auto cmd = gcnew System::Action<参数类型^>gcnew System::Action(对象实例, &SomeClass::DoSomeThing)

    调用cmd(参数),编译器就不提示错误了,运行同样正常

    2013年12月2日 8:10
  • 你好,

    真诚感谢你的分享和对本论坛的贡献。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月3日 6:39
    版主