无法调用System :: Action ^

时间:2015-01-13 16:43:40

标签: c++-cli

我有一个C ++ / CLI项目。在这个C ++ / CLI项目中,我编写了一个小助手来缓解可以从System :: Action / Func转换为C ++ callable的痛苦。这是一个专业化的例子。

template<> struct Callable<void()> {
    Callable(System::Action^ f) : func(std::move(f)) {}
    Handle<System::Action> func;
    void operator()() {
        System::Action^ f = *func;
        f();
    }
};

但是,此代码无法编译。它告诉我System::Action::Invoke无法访问,无法调用。

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

2 个答案:

答案 0 :(得分:1)

使用msclr::gcroot在原生类型中保留跟踪指针。

这段代码在VS2013上编译好我:

#include <msclr\gcroot.h>

struct CallableAction
{
    msclr::gcroot<System::Action^> func;
    CallableAction(System::Action^ f) : func(f) {}
    void operator()()
    {
        func->Invoke();
    }
};

它也可以作为模板工作正常,我只是简化了,所以我不必担心它是否被正确实例化并完全错误检查。

答案 1 :(得分:1)

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