成功解决qt_ros 报错:has_binary_operator.hp:52: Parse error at “BOOST_JOIN“


成功解决qt_ros 报错:
usr/include/boost/type_traits/detail/has_binary_operator.hpp:52: Parse error at "BOOST_JOIN"
make[2]: *** [include/modeldebug/moc_qnode.cxx] Error 1 make[2]: *** Waiting for unfinished jobs… usr/include/boost/type_traits/detail/has_binary_operator.hp:52

0 报错原因:

某个源文件多次(至少两次以上)包含了同一个头文件,所以才导致报错。
解决办法如下:

#ifndef起到的作用是防止一个源文件两次包含一个头文件。假如你有一个c源文件,它包含了多个头文件:头文件A和头文件B,而头文件B又包含了头文件A,则最终的效果是,该源文件包含了两次头文件A。若在头文件A中定义了结构体或者类类型,编译时会报大量的重复定义错误。所以要用到# ifndef 与#endif,当第一次包含该头文件时,由于没有定义,条件为真,这样就会包含# ifndef 与#endif之间的代码,,当第二次包含头文件,前面已经定义好了,条件为假,# ifndef 与#endif之间的代码也不会再次包含,这样就避免重复定义了。
总结来说:
条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。条件编译当然也可以用条件语句来实现, 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。

1. 打开has_binary_operator.hpp 文件

sudo gedit /usr/include/boost/type_traits/detail/has_binary_operator.hpp

2. 大致修改如下:修改参考 3具体修改

Modify “namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {…}”

修改为:

" #ifndef Q_MOC_RUN
namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) { #endif … #ifndef Q_MOC_RUN } #endif "

3. 具体修改如下 :

3.1在文件开头修改如下:

在这里插入图片描述

在这里插入图片描述

3.1.1 文件开头修改好的代码:

#ifndef Q_MOC_RUN
namespace BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl) {
#endif

3.2在文件末端修改如下:

在这里插入图片描述

在这里插入图片描述

3.2.1 文件末修改好的代码:

 #ifndef Q_MOC_RUN 
} // namespace impl
#endif
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常驻客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值