4

我有一个使用 Qt 和点云库 (PCL) 等库在 Vs 2008 中编辑的程序。

PCL 有一个包含 boost 的 3rd 方库。

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

1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/sequenced_index.hpp(926) : 错误 C3083: 'Q_FOREACH': '::' 左边的符号必须是类型 1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/sequenced_index.hpp(926) : 错误 C2039: 'tag' : is not a member of 'boost' 1>C :\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/sequenced_index.hpp(926):错误 C2061:语法错误:标识符 'tag' 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:“标签”:不是 'boost' 的成员 1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/ordered_index.hpp(1399):错误 C2061:语法错误:标识符 'tag' 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) : error C2039: 'tag' : is not a member of 'boost' 1>C:\ Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/hashed_index.hpp(1254):错误 C2061:语法错误:标识符 'tag' 1>C:\Program Files\PCL 1.5.1\3rdParty\ Boost\include\boost/multi_index/random_access_index.hpp(1012):错误 C3083:'Q_FOREACH':'::' 左侧的符号必须是类型 1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/random_access_index.hpp(1012):错误 C2039:'tag ' : 不是 'boost' 的成员 1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/random_access_index.hpp(1012) : 错误 C2061: 语法错误: 标识符 'tag'

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

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与 boost foreach 的冲突。

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

4

2 回答 2

5

问题是 Qt 定义了一个与命名空间冲突的foreach宏 ( ) 。#define foreach Q_FOREACHboost::foreach

解决它的最简单方法是在 Qt 之前包含 Boost,或者在包含 boost 的头文件之前简单地取消定义 Qt 的宏。// remember to include Boost before Qt我更喜欢第二种,因为它不需要额外的文档(

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

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

于 2017-06-08T15:59:08.950 回答
1

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

但随后您需要替换代码中的 qt 关键字,例如slots, signals, emit...,请参阅这篇文章

(在我的项目中引入 boost::multi_index 容器时,我收到了这条消息。)

  • (对于 qmake 项目CONFIG += no_keywords执行此操作。)
  • (对于 cmake 项目add_definitions(-DQT_NO_KEYWORDS)执行此操作。)
于 2015-07-20T12:21:21.480 回答