头文件循环引用的错误

In file included from /usr/include/c++/5/memory:81:0,
from Threadpool.h:12,
from testThreadpool.cc:7:
/usr/include/c++/5/bits/unique_ptr.h: In instantiation of ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = wd::Thread]’:
/usr/include/c++/5/bits/unique_ptr.h:236:17: required from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = wd::Thread; _Dp = std::default_delete<wd::Thread>]’
/usr/include/c++/5/bits/stl_construct.h:93:7: required from ‘void std::_Destroy(_Tp*) [with _Tp = std::unique_ptr<wd::Thread>]’
/usr/include/c++/5/bits/stl_construct.h:103:19: required from ‘static void std::_Destroy_aux<<anonymous> >::__destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = std::unique_ptr<wd::Thread>*; bool <anonymous> = false]’
/usr/include/c++/5/bits/stl_construct.h:127:11: required from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = std::unique_ptr<wd::Thread>*]’
/usr/include/c++/5/bits/stl_construct.h:151:15: required from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator<_T2>&) [with _ForwardIterator = std::unique_ptr<wd::Thread>*; _Tp = std::unique_ptr<wd::Thread>]’
/usr/include/c++/5/bits/stl_vector.h:424:22: required from ‘std::vector<_Tp, _Alloc>::~vector() [with _Tp = std::unique_ptr<wd::Thread>; _Alloc = std::allocator<std::unique_ptr<wd::Thread> >]’
Threadpool.h:34:19: required from here
/usr/include/c++/5/bits/unique_ptr.h:74:22: error: invalid application of ‘sizeof’ to incomplete type ‘wd::Thread’
static_assert(sizeof(_Tp)>0,
^
Makefile:12: recipe for target ‘a.out‘ failed
make: *** [a.out] Error 1

最近在写代码的时候,出现一个莫名奇妙的错误,查找了一个多小时,代码功能方面没有错误,但是出现一个看不懂的额问题,终于发现错误所在,原来是头文件循环引用了!!!

铭记:实在找不出代码问题所在,不妨查看一下头文件引用是否错误!

我以为我找对问题了,其实不是这个原因。。。

真正的原因是unique_ptr不能复制,换成shared_ptr就行了。这个很容易忽略。

建议

一般情况下,用shared_ptr就行了;

如果非要用unique_ptr,一定要找准位置,最好用的范围小一些,不然很难看出问题出在哪里。

原文地址:https://www.cnblogs.com/cthon/p/9260975.html

时间: 2024-10-12 19:21:23

头文件循环引用的错误的相关文章

#include、#import与@class的使用与头文件循环引用问题

#include #include <>:通常是对系统库文件的引用,编译器会去系统文件目录下查找. #include "xxx.h":通常是对自定义文件的引用,编译器首先会去用户目录下查找,然后再去安装目录查找,最后去系统文件目录查找. #import #import的功能与#include差不多,但是可以解决头文件重复导入的问题,而#include会有重复导入头文件的问题, 比如class文件A.B都引用了class C,如果class D引用了class A.B,这时候

c++ 头文件循环引用解法

A.h #include "B.h" class A{ public: B* m_b; } B.h #include "A.h" class B{ public: A* m_a; } 上面这样是编译不过的,把A.h中的 #include "B.h" 去掉,改为 class B;

头文件重复引用

Q:.h头文件中的ifndef/define/endif 的作用? A:防止该头文件被重复引用. 说明: 有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些. 有的会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的) . 如果头文件被循环包含,有的编译器会智能处理,和只include一次一样:有的会报错,有的直接死锁,导致编译程序崩溃(这个只有很低级的编译器才会出现在几乎看不到了). 不管怎样,用ifnde xxx #defi

C ++头文件的十大错误,如何解决这些问题

Top 10 C++ header file mistakes and how to fix them C++ header files is a rather mundane topic by most standards. Talking about header files is not as interesting as discussing complex search algorithms or debating design patterns . It’s not an acade

c++头文件重复引用问题

引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include "b.h" class a{ public: a(); ~a(); } a.cpp #incldue "a.h" a::a(){ .... }; a::~a(){ .... }; b.h #include "a.h" class b{ public: b();

STM32 关于头文件路径没添加错误问题(cannot open source input file &quot;spi.h&quot;: No such file or directory)

error:  #5: cannot open source input file "spi.h": No such file or directory 1.出现这种问题,首先要确认头文件的命名要与文件名一致,如下: #ifndef _SPI_H #define _SPI_H #endif 2.添加路径,问题即可解决 3.确认OK,编译,问题解决! 原文地址:https://www.cnblogs.com/xingboy/p/9541267.html

clion中资源文件以及头文件的引用

在代码界面的最上面出现了 the file does not belong are project....... 按照上面的样式把文件添加进去  在reload的一下就OK了 原文地址:https://www.cnblogs.com/future-dream/p/9739677.html

关于Cocos2d-x头文件的引用

cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprite.h已经不见了,取代的是G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\cocos\ui\UIScale9Sprite.h 还有就是#include "..\extensions/GUI/CCControlExtension/CCControlSwitch.h"

#ifndef #define #endif 防止头文件被重复引用

想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?   其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.比如:存在a.h文件#include "c.h