我一直在尝试通过使用 unique_ptr 来实现 PIMPL 习惯用法。\n我从几篇文章中得到启发,这些文章总是强调相同的要点:仅在实现 PIMPL 的类的标头中声明析构函数,然后在您的 . .cpp 文件。否则,您将收到诸如“Incomplete type bla bla”之类的编译错误。
\n好吧,我做了一个尊重这一点的小测试,但我仍然有“不完整类型”错误。代码就在下面,非常短。
\nA.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};\nRun Code Online (Sandbox Code Playgroud)\nA.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}\nRun Code Online (Sandbox Code Playgroud)\n主要.cpp:
\n#include "A.hpp"\n\nint main()\n{\n A a1;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n我用两种(快速和肮脏的)方式构建,从我的角度来看,结果非常令人惊讶。
\n首先我在没有链接 A.cpp 的情况下构建
\ng++ -c A.cpp\nRun Code Online (Sandbox Code Playgroud)\n到目前为止没有错误。
\n然后,我编译了 A.cpp 和 main.cpp 以创建可执行文件
\ng++ A.cpp main.cpp -o test\nRun Code Online (Sandbox Code Playgroud)\n这就是我遇到麻烦的地方。这里我得到了关于不完整类型的著名错误:
\nIn …Run Code Online (Sandbox Code Playgroud)