C++ cli 无法调用System::Action^

C++ cli 无法调用System::Action^,c++-cli,C++ Cli,我有一个C++/CLI项目。在这个C++/CLI项目中,我编写了一个小助手,用于减轻从系统:动作/FUNC到C++可调用的痛苦。这里有一个专门化的例子 template<> struct Callable<void()> { Callable(System::Action^ f) : func(std::move(f)) {} Handle<System::Action> func; void operator()() {

我有一个C++/CLI项目。在这个C++/CLI项目中,我编写了一个小助手,用于减轻从系统:动作/FUNC到C++可调用的痛苦。这里有一个专门化的例子

template<> struct Callable<void()> {
    Callable(System::Action^ f) : func(std::move(f)) {}
    Handle<System::Action> func;
    void operator()() {
        System::Action^ f = *func;
        f();
    }
};
模板结构可调用{
可调用(系统::操作^f):func(标准::移动(f)){
处理函数;
void运算符()(){
系统::操作^f=*func;
f();
}
};
但是,此代码不编译。它告诉我,
System::Action::Invoke
不可访问,无法调用


如何从C++/CLI调用
System::Action

使用
msclr::gcroot
在本机类型中保存跟踪指针

这段代码在VS2013上编译得很好:

#include <msclr\gcroot.h>

struct CallableAction
{
    msclr::gcroot<System::Action^> func;
    CallableAction(System::Action^ f) : func(f) {}
    void operator()()
    {
        func->Invoke();
    }
};
#包括
结构CallableAction
{
msclr::gcroot func;
CallableAction(System::Action^f):func(f){}
void运算符()()
{
func->Invoke();
}
};

作为一个模板,它也应该可以很好地工作,我只是简化了它,这样我就不必担心它是否被正确地实例化并进行了全面的错误检查。

这似乎是编译器只是误报了问题,这实际上是在另一个正在实例化的专门化中,参数是System::Action无法处理的本机类型。我不知道为什么它选择给我问题中的错误,而不是实际的错误。

std::move
对跟踪指针毫无用处——不管怎样,你都要复制指针。而
Handle
应该是不可能的,它必须是
Handle
。你的
Handle
类提供了哪些
gcroot
没有的功能?@BenVoigt:我刚到这里(在C++/CLI中)。我只知道未键入的GCHandle。我知道你已经习惯了我的无所不能和无所不知,所以试着坐下来一会。这是因果报应。编译器知道你给聊天室起了什么名字。