通過 是否需要知道T的完整定義來使用std::unique_ptr?,我知道如果一個類A
有一個成員unique_ptr<T>
,那麼在析構函數~A()
中,T
必須是一種完整的類型。然而,我遇到了一種情況,即構造函數A()
還要求T
的完整類型,請參見下面的代碼:
// a.h -------------------------------
#pragma once
#include <memory>
struct B;
struct A {
A(); // <---
~A();
std::unique_ptr<B> ptr;
};
// a.cpp -------------------------------
#include "a.h"
struct B {};
A::A() = default; // <---
A::~A() = default;
// main.cpp -------------------------------
#include "a.h"
int main() {A a;}
如果将构造函数
A::A()
的定义移动到头文件 a.h
中,编译器会报错 error: invalid application of ‘sizeof’ to incomplete type ‘B’
。为什么会发生这种情况?是否有相关的参考资料?顺便说一下,我正在使用启用了 c++17 的 Ubuntu 18.04 上的 gcc-7.5.0。
针对评论中的 @463035818_is_not_a_number 进行编辑。完整的错误信息如下:
[1/2] Building CXX object CMakeFiles/t.dir/main.cpp.o
FAILED: CMakeFiles/t.dir/main.cpp.o
/usr/bin/c++ -g -fdiagnostics-color=always -std=gnu++1z -MD -MT CMakeFiles/t.dir/main.cpp.o -MF CMakeFiles/t.dir/main.cpp.o.d -o CMakeFiles/t.dir/main.cpp.o -c /home/user/Tests/UniquePtrTest/main.cpp
In file included from /usr/include/c++/7/memory:80:0,
from /home/user/Tests/UniquePtrTest/a.h:2,
from /home/user/Tests/UniquePtrTest/main.cpp:1:
/usr/include/c++/7/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = B]’:
/usr/include/c++/7/bits/unique_ptr.h:263:17: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = B; _Dp = std::default_delete<B>]’
/home/user/Tests/UniquePtrTest/a.h:5:3: required from here
/usr/include/c++/7/bits/unique_ptr.h:76:22: error: invalid application of ‘sizeof’ to incomplete type ‘B’
static_assert(sizeof(_Tp)>0,
^
ninja: build stopped: subcommand failed.
#include
基本上只是替换文本,因此应该可以在单个文件中使用代码重现它。这样做可以使其他人更容易地复制。 - 463035818_is_not_a_number