我有一个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
?
答案 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无法处理的本机类型。我不知道为什么它选择在问题中给出错误而不是实际错误。