使用std::unique_ptr报错:memory:error invalid application of 'sizeof' to incomplete type '***' 排查后,不使用std::unique_ptr就ok。 使用的std::unique_ptr包装的类型是在第三方库,看不到具体结构和实现,使用前置声明来包含使用的。 纠其原因,从报错可以看出: std::unique_ptr中需要静态检测类型的大小st...
/usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incompletetype‘Impl’79|static_assert(sizeof(_Tp)>0,|^~~~ 原因分析 从报错我们可以看出,std::unique_ptr中需要静态检测类型的大小static_assert(sizeof(Impl)>0,但是我们的Impl是一个预先声明的类型,是inco...
/usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of ‘sizeof’ to incompletetype‘Impl’ 79 | static_assert(sizeof(_Tp)>0, | ^~~~ 原因分析 从报错我们可以看出,std::unique_ptr中需要静态检测类型的大小static_assert(sizeof(Impl)>0,但是我们的Impl是一个预先声明的类型...
In file includedfrommain.cpp:1:In file includedfrom./widget.h:1:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/memory:1424:19:error:invalid applicationof'sizeof'to an incompletetype'Widget::Impl'static_assert(sizeof(_Tp)>0,^~~~/Library/Developer/CommandLineTools/SDK...
我还没有完全理解这个问题,但是原因是m_ptr成员的默认成员初始化器。如果使用成员初始化程序列表,则会...
#include <memory> struct A; struct B { B(); ~B(); std::unique_ptr<A> ptr{nullptr}; }; int main(){ B b; } This compiles in C++23 mode with GCC and Clang and in C++20 mode with MSVC. Compiler Explorer It fails to compile in C++23 with MSVC. The support told me that thi...
在C ++中,如果头文件类定义中的任何内容发生更改,则必须重新编译该类的,即使所更改是私有类成员。这...
即,在其第一次声明之后显式默认)在其显式默认的点处被隐式定义;如果这样的函数被隐式定义为已删除,则程序是病态的。一个非用户提供的默认函数(即类中隐式声明或显式默认的),如果未被定义为已删除,则在odr使用([basic.def.odr])或常量求值需要([expr.const])时被隐式定义。
unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Impl; _Dp = std::default_delete<Impl>]’widget.h:5:7: required from here/usr/include/c++/9/bits/unique_ptr.h:79:16: error: invalid application of 'sizeof’ to incomplete type 'Impl’79 | static_assert(sizeof(_Tp)>0, | ^...
问题是A::A()需要知道在构造函数抛出时如何销毁ptr。举个例子: