来自std::unique_ptr 需要知道 T 的完整定义吗?,我知道如果一个类A有一个成员unique_ptr<T>,那么T在析构函数中应该是一个完整的类型~A()。但是,我遇到了一种情况,构造函数A()也需要完整的类型T,请参见下面的代码:
// a.h -------------------------------\n#pragma once\n#include <memory>\nstruct B;\nstruct A {\n A(); // <---\n ~A();\n std::unique_ptr<B> ptr;\n};\n\n// a.cpp -------------------------------\n#include "a.h"\nstruct B {};\nA::A() = default; // <---\nA::~A() = default;\n\n// main.cpp -------------------------------\n#include "a.h"\nint main() {A a;}\nRun Code Online (Sandbox Code Playgroud)\n如果构造函数的定义A::A()被移动到头文件中a.h,编译器将会报错error: invalid application of \xe2\x80\x98sizeof\xe2\x80\x99 to incomplete type \xe2\x80\x98B\xe2\x80\x99。为什么会发生这种情况?有这方面的参考资料吗?
顺便说一句,我在 Ubuntu 18.04 上使用 gcc-7.5.0,启用了 c++17。
\n在评论中编辑@463035818_is_not_a_number。完整的错误信息是:
\n[1/2] Building CXX …Run Code Online (Sandbox Code Playgroud)