小编Pla*_*erK的帖子

PIMPL 习惯用法实际上可以使用 std::unique_ptr 工作吗?

我一直在尝试通过使用 unique_ptr 来实现 PIMPL 习惯用法。\n我从几篇文章中得到启发,这些文章总是强调相同的要点:仅在实现 PIMPL 的类的标头中声明析构函数,然后在您的 . .cpp 文件。否则,您将收到诸如“Incomplete type bla bla”之类的编译错误。

\n

好吧,我做了一个尊重这一点的小测试,但我仍然有“不完整类型”错误。代码就在下面,非常短。

\n

A.hpp:

\n
#pragma once\n#include <memory>\n\nclass A\n{\npublic:\n  A();\n  ~A();\nprivate:\n  class B;\n  std::unique_ptr<B> m_b = nullptr;\n};\n
Run Code Online (Sandbox Code Playgroud)\n

A.cpp:

\n
#include "A.hpp"\n\nclass A::B\n{\n\n};\n\nA::A()\n{\n\n}\n\nA::~A() // could be also \'= default\'\n{\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

主要.cpp:

\n
#include "A.hpp"\n\nint main()\n{\n  A a1;\n\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我用两种(快速和肮脏的)方式构建,从我的角度来看,结果非常令人惊讶。

\n

首先我在没有链接 A.cpp 的情况下构建

\n
g++ -c A.cpp\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止没有错误。

\n

然后,我编译了 A.cpp 和 main.cpp 以创建可执行文件

\n
g++ A.cpp main.cpp -o test\n
Run Code Online (Sandbox Code Playgroud)\n

这就是我遇到麻烦的地方。这里我得到了关于不完整类型的著名错误:

\n
In …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

5
推荐指数
1
解决办法
480
查看次数

标签 统计

c++ ×1

c++11 ×1

c++14 ×1