Windows runtime C2280和x27;winrt::hstring::hstring(std::nullptr_t)和#x27;:试图引用已删除的函数

Windows runtime C2280和x27;winrt::hstring::hstring(std::nullptr_t)和#x27;:试图引用已删除的函数,windows-runtime,uwp-xaml,c++-cx,c++-winrt,cppwinrt,Windows Runtime,Uwp Xaml,C++ Cx,C++ Winrt,Cppwinrt,在cppcx中,我有一段代码: auto frame = ref new Frame(); frame->Navigate(TypeName(CppCxInternalRefClass::typeid), ref new AnotherCppCxInternalRefClass(a, b, c, ...)); 我正试图将其转换为cppwinrt,如下所示: Frame frame; frame.Navigate( u

在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,
                    ...)));
auto cppCxFrame = utils::to_cx<Frame>(frame);
            cppCxFrame->Navigate(TypeName(CppCxInternalRefClass::typeid),
                ref new AnotherCppCxInternalRefClass(a, b, c, ...));
帧;
框架。导航(
utils::from_cx(类型名(CppCxInternalRefClass::typeid)),
utils::来自(
参考新的另一个CPPCX内部参考等级(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;
模板
T from_cx(平台::对象^from){
=>T到{nullptr};
winrt::guid iid=winrt::guid_of();
winrt::check\u hresult(重新解释强制转换(从)->QueryInterface(
重新解释(iid),重新解释(winrt::put_abi(to));
返回;
看起来像是C++/CX,我们可以通过执行此代码正在执行的ClassName:typeid来获取类的typeid。因此,有一个TypeName构造函数将其作为参数。但是在cppwinrt中更改为结构后,它需要两个结构变量的初始值设定项。我不确定如何处理此问题,尤其是对于ref-cla由于目前缺乏对IDL的支持,我的代码库尚未准备好将其移植到CPPWIRT。因此我决定只使用cppcx代码,但使用帮助函数将其转换,但在转换时会遇到此错误

但是,如果我改变这种方法:

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,
                    ...)));
auto cppCxFrame = utils::to_cx<Frame>(frame);
            cppCxFrame->Navigate(TypeName(CppCxInternalRefClass::typeid),
                ref new AnotherCppCxInternalRefClass(a, b, c, ...));
auto-cppCxFrame=utils::to_-cx(frame);
cppCxFrame->导航(TypeName(CppCxInternalRefClass::typeid),
参考新的另一个CPPCX内部参考类(a、b、c等);

它构建得很好。

如果你可以通过winmd获得C++/CX类的投影,那么这将很容易。假设你做不到这一点,你需要从C++/CX
TypeName
转换为C++/WinRT
TypeName
。\u CX的基本
不会这样做,因为
TypeName
是一个结构,而不是运行时类,但是可以直接从_cx
添加
重载来处理
TypeName
结构和它所包含的
hstring

winrt::hstring from_cx(平台::字符串^const&from)
{
winrt::hs尝试;
const HSTRING&fromHstring=重新解释铸坯(从);
winrt::从\ abi(到,从字符串)复制\ U;
返回;
}
winrt::Windows::UI::Xaml::Interop::TypeName from_cx(::Windows::UI::Interop::TypeName const&from)
{
返回{
静态施法(来自种类),
from_cx(from.Name)
};
}

您可能正在寻找函数模板。我的理解是,这是针对winrt类型的。InternalRefClass和AnotherInternalRefClass是尚未转换为winrt类的c++/cx ref类。我想说的是,InternalRef类和AnotherInternalRefClass是c++/cx样式的ref类。我正在尝试转换c++/cx ref类在不更改ref类的情况下将其转换为c++/winrt的ode。我也更新了说明。您的意思是要在c++/CX项目中实现从c++/CX到c++/winrt的转换吗?有关c++/CX和c++/winrt之间的转换的更多信息,您可以参考此内容。此外,根据您的说明,目前您可以成功地ild项目,对吗?我有一个解决方法,我将fram转换为CX对象并在其上调用navigate。但是如果我能让这行工作起来,它会更干净:utils::from_CX(TypeName(CppCxInternalRefClass::typeid))