/usr/include/c++/8/bits/unique_ptr.h:79:16: 错误:invalid application of ‘sizeof’ to incomplete type
- centos系统
- g++编译器
在使用unique_ptr这个智能指针的时候,偶尔会遇到这个报错了,一直没有细想,一直都是莽撞,左试试右试试,今天终于解惑了,这个原因是当编译器默认生成了析构函数,而你有一个前置声明的类class Test,你没有include “Test.h”因为在想着降低编译时候的依赖,可是问题突然出现就蒙了。你在想我这是个指针按理来说头文件前置声明就行了阿?当你试试include "Test.h"突然发现,好使了欣喜若狂的时候误以为是uniqe_ptr不支持前置声明,我一开始就是这么误以为的。其实是不对的,尽管在A.cpp文件中include了include “Test.h”,可是A的析构函数默认生成在A.h文件中,并不知道Test的大小,所以会报错。当然你可以在.h文件直接引用Test.h文件,但为了降低依赖,可以在类A中声明析构函数,在A.cpp中调用这个析构函数
class Test;
class A{
std::unique_ptr<Test> tPtr_;
};
当使用C++的std::unique_ptr时,如果类定义为前置声明且未包含完整的类型信息,编译器会在尝试计算对象大小时报错。错误消息`invalid application of ‘sizeof’ to incomplete type`表明析构函数在不知道完整类型的情况下尝试执行。解决方案是在需要的地方包含相应的头文件,或者在类定义中显式声明析构函数并在cpp文件中实现,以避免不必要的依赖。降低依赖性的做法应在保持代码可编译的前提下进行。
1296

被折叠的 条评论
为什么被折叠?



