相关疑难解决方法(0)

为什么 unique_ptr 需要构造函数中的完整类型?

来自std::unique_ptr 需要知道 T 的完整定义吗?,我知道如果一个类A有一个成员unique_ptr<T>,那么T在析构函数中应该是一个完整的类型~A()。但是,我遇到了一种情况,构造函数A()也需要完整的类型T,请参见下面的代码:

\n
// 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;}\n
Run 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。为什么会发生这种情况?有这方面的参考资料吗?

\n

顺便说一句,我在 Ubuntu 18.04 上使用 gcc-7.5.0,启用了 c++17。

\n
\n

在评论中编辑@463035818_is_not_a_number。完整的错误信息是:

\n
[1/2] Building CXX …
Run Code Online (Sandbox Code Playgroud)

c++ stl unique-ptr incomplete-type c++11

4
推荐指数
1
解决办法
382
查看次数

标签 统计

c++ ×1

c++11 ×1

incomplete-type ×1

stl ×1

unique-ptr ×1