无法调用 System::Action^
Cannot call System::Action^
我有一个 C++/CLI 项目。在这个 C++/CLI 项目中,我编写了一个小帮助程序来减轻从 System::Action/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();
}
};
但是,这段代码无法编译。它告诉我 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();
}
};
作为模板它应该也能正常工作,我只是对其进行了简化,这样我就不必担心它是否被正确实例化并进行了全面的错误检查。
这似乎是编译器简单地误报了问题,这实际上是在另一个正在实例化的专门化中,其中参数是 System::Action 无法处理的本机类型。我不知道为什么它选择给我问题中的错误而不是实际错误。
我有一个 C++/CLI 项目。在这个 C++/CLI 项目中,我编写了一个小帮助程序来减轻从 System::Action/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();
}
};
但是,这段代码无法编译。它告诉我 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();
}
};
作为模板它应该也能正常工作,我只是对其进行了简化,这样我就不必担心它是否被正确实例化并进行了全面的错误检查。
这似乎是编译器简单地误报了问题,这实际上是在另一个正在实例化的专门化中,其中参数是 System::Action 无法处理的本机类型。我不知道为什么它选择给我问题中的错误而不是实际错误。