在 cppcx 中,我有这段代码:
auto frame = ref new Frame();
frame->Navigate(TypeName(CppCxInternalRefClass::typeid), ref new AnotherCppCxInternalRefClass(a, b, c,
...));
我正在尝试像这样转换为 cppwinrt:
Frame frame;
frame.Navigate(
utils::from_cx<winrt::TypeName>(TypeName(CppCxInternalRefClass::typeid)),
utils::from_cx<winrt::Windows::UI::Xaml::FrameworkElement>(
ref new AnotherCppCxInternalRefClass(a, b, c,
...)));
但我收到一个错误:
错误 C2280 'winrt::hstring::hstring(std::nullptr_t)':试图引用已删除的函数
这是我收到错误的函数和行:
template <typename T>
T from_cx(Platform::Object ^ from) {
===>T to{nullptr};
winrt::guid iid = winrt::guid_of<T>();
winrt::check_hresult(reinterpret_cast<::IUnknown*>(from)->QueryInterface(
reinterpret_cast<GUID&>(iid), reinterpret_cast<void**>(winrt::put_abi(to))));
return to;
看起来像 C++/CX 一样,我们可以通过执行该代码正在执行的 ClassName:typeId 来获取类的 typeid。所以有一个 TypeName 构造函数将它作为参数。但是在 cppwinrt 中更改为结构后,它需要两个结构变量的初始值设定项。我不确定如何处理这个问题,尤其是这段代码中的 ref 类,由于目前缺乏对 idls 的支持,我的代码库还没有准备好移植到 cppwinrt。所以我决定只使用 cppcx 代码,但使用辅助函数来转换它们,但在转换时会遇到这个错误。
但是,如果我将方法更改为这样的:
auto cppCxFrame = utils::to_cx<Frame>(frame);
cppCxFrame->Navigate(TypeName(CppCxInternalRefClass::typeid),
ref new AnotherCppCxInternalRefClass(a, b, c, ...));
它构建良好。