首页 >后端开发 >C++ >为什么 `std::unique_ptr` 因类型不完整而失败,以及如何修复它?

为什么 `std::unique_ptr` 因类型不完整而失败,以及如何修复它?

Linda Hamilton
Linda Hamilton原创
2024-12-08 01:29:16970浏览

Why Does `std::unique_ptr` Fail with Incomplete Types, and How Can I Fix It?

std::unique_ptr 的不完整类型障碍

使用不完整类型的 std::unique_ptr 会引发编译问题。当将 pimpl 习惯用法与 std::unique_ptr 一起使用时,类似以下的代码可能会触发此类问题:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // compilation failure
};

遇到有关不完整类型的编译错误,因为 std::unique_ptr 需要完整的类型定义。

揭示根本原因:破坏缺陷

尽管 std::unique_ptr 和不完整类型之间存在预期的兼容性,但问题源于缺少析构函数声明。编译器生成的默认构造函数需要完整声明已实现的类。

要纠正此问题,请在外部类中显式定义析构函数,以确保其在已实现的类完成时可用:

class foo
{ 
    class impl;
    std::unique_ptr<impl> impl_;

public:
    foo(); // May require a default constructor defined elsewhere

    ~foo(); // Implement with an empty body or use "= default;"
};

模板构造函数的注意事项

定义模板构造函数会使事情变得复杂,即使实现的成员未初始化:

template <typename T>
foo::foo(T bar) 
{
    // Compiler requires knowledge of impl_ destruction in case of exceptions
}

命名空间级别限制

在命名空间范围内使用带有不完整类型的 std::unique_ptr 也会带来挑战:

class impl;
std::unique_ptr<impl> impl_;

编译器需要知道如何销毁静态持续时间对象。补救措施在于将 std::unique_ptr 包装在具有定义的析构函数的自定义结构中:

class impl;
struct ptr_impl : std::unique_ptr<impl>
{
    ~ptr_impl(); // Implement with an empty body
} impl_;

以上是为什么 `std::unique_ptr` 因类型不完整而失败,以及如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn