【问题标题】:C2280 'winrt::hstring::hstring(std::nullptr_t)': attempting to reference a deleted functionC2280 'winrt::hstring::hstring(std::nullptr_t)':试图引用已删除的函数
【发布时间】:2020-12-20 17:33:31
【问题描述】:

在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, ...));

它构建得很好。

【问题讨论】:

  • 您可能正在寻找xaml_typename 函数模板。
  • 我的理解是winrt类型的。 InternalRefClass 和 AnotherInternalRefClass 是 c++/cx 引用类,尚未转换为 winrt 类。
  • 我想说的是 Internal ref 类和 AnotherInternalRefClass 是 C++/CX 风格的 ref 类。我正在尝试在不更改 ref 类的情况下将使用它的代码转换为 c++/winrt。我也更新了描述。
  • 您的意思是要在 C++/CX 项目中实现从 C++/CX 到 C++/WinRT 的转换吗?有关 C++/CX 和 C++/WinRT 之间转换的更多信息,您可以参考此document。另外,根据您的描述,目前您可以成功构建项目吧?
  • 我有一个解决方法,我将框架转换为 CX 对象并在其上调用导航。但如果我能让这条线工作会更干净: utils::from_cx<:typename>(TypeName(CppCxInternalRefClass::typeid))

标签: windows-runtime uwp-xaml c++-cx c++-winrt cppwinrt


【解决方案1】:

如果您可以通过 winmd 获得 C++/CX 类的投影,那么这将很容易。假设您不能这样做,您需要从 C++/CX TypeName 转换为 C++/WinRT TypeName。基本的from_cx 不会这样做,因为TypeName 是一个结构,而不是运行时类,但是添加from_cx 的重载来处理TypeName 结构和它所拥有的hstring 很简单。

winrt::hstring from_cx(Platform::String^ const& from)
{
  winrt::hstring to;
  const HSTRING& fromHstring = reinterpret_cast<HSTRING>(from);
  winrt::copy_from_abi(to, fromHstring);
  return to;
}

winrt::Windows::UI::Xaml::Interop::TypeName from_cx(::Windows::UI::Interop::TypeName const& from)
{
  return {
    static_cast<winrt::Windows::UI::Xaml::Interop::TypeKind>(from.Kind),
    from_cx(from.Name)
  };
}

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2014-02-19
    • 2014-09-15
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多