推动与Q_FOREACH(Qt)和moc生成的foreach冲突?

时间:2012-12-03 15:23:37

标签: c++ qt boost point-cloud-library

我在Vs 2008中使用Qt和Point Cloud Library(PCL)等一些库编辑了一个程序。

PCL有一个包含boost的第三方库。

但是,编译后出现了一些错误:

  

1> C:\ Program Files \ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / sequenced_index.hpp(926)   :错误C3083:'Q_FOREACH':'::'左边的符号必须是a   类型1> C:\ Program Files \ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / sequenced_index.hpp(926)   :错误C2039:'tag':不是'boost'1> C:\ Program的成员   文件\ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / sequenced_index.hpp(926)   :错误C2061:语法错误:标识符'标记'1> C:\ Program Files \ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / ordered_index.hpp(1399):错误C3083:'Q_FOREACH':'::'左边的符号必须是   类型1> C:\ Program Files \ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / ordered_index.hpp(1399):错误C2039:'tag':不是'boost'的成员1> C:\ Program   文件\ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / ordered_index.hpp(1399):错误C2061:语法错误:标识符'标记'1> C:\ Program Files \ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp(1254):错误C3083:'Q_FOREACH':'::'左边的符号必须是   类型1> C:\ Program Files \ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp(1254):错误C2039:'tag':不是'boost'的成员1> C:\ Program   文件\ PCL   1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp(1254):错误C2061:语法错误:标识符'标记'1> C:\ Program Files \ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / random_access_index.hpp(1012)   :错误C3083:'Q_FOREACH':'::'左边的符号必须是a   类型1> C:\ Program Files \ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / random_access_index.hpp(1012)   :错误C2039:'tag':不是'boost'1> C:\ Program的成员   文件\ PCL   1.5.1 \的3rdParty \升压\包括\升压/ multi_index / random_access_index.hpp(1012)   :错误C2061:语法错误:标识符'标记'

对于第一个问题,源文件中的错误位置是:

template<typename SuperMeta,typename TagList>
inline boost::mpl::true_* boost_foreach_is_noncopyable(
  boost::multi_index::detail::random_access_index<SuperMeta,TagList>*&,
  boost::foreach::tag) // <-------------error here for the first compile error.
{
  return 0;
}

我想也许这表明Q_FOREACH与促进foreach的冲突。

但我不知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

设置编译器标志&Foo,禁用boost和qt之间的冲突!

但是,您需要替换代码中的qt关键字,例如-DQT_NO_KEYWORDSslotssignals ...,请参阅java nio tftp client

(我在项目中引入boost :: multi_index容器时收到此消息。)

  • (对于qmake项目emit执行此操作。)
  • (对于cmake项目CONFIG += no_keywords执行此操作。)

答案 1 :(得分:1)

问题是Qt定义了foreach宏(#define foreach Q_FOREACH),它与boost::foreach命名空间冲突。

最简单的解决方法是在Qt之前包含Boost,或者在包含boost的头文件之前简单地取消定义Qt的宏。我更喜欢第二种,因为它不需要额外的文档(// remember to include Boost before Qt),并且在嵌套的头文件中管理更容易,如果你使用预编译的头文件。

#undef foreach
#include <boost/foreach.hpp>

此选项比禁用Qt的关键字(编译标记-DQT_NO_KEYWORDS)侵入性更小,并且只能在受影响的文件中应用(如果需要)。它不会影响Q_FOREACH的使用(显然,如果你使用Qt foreach,它将失败)。它也独立工作,Qt包含在<boost/foreach.hpp>之前或之后。