lig*_*rek 4 c++ qt boost point-cloud-library
我有一个在 Vs 2008 中使用一些库(例如 Qt 和 Point Cloud Library (PCL))编辑的程序。
PCL 有一个包含 boost 的 3rd 方库。
但是编译后出现了一些错误:
1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/sequenced_index.hpp(926) : error C3083: 'Q_FOREACH': '::'左边的符号必须是类型 1>C:\Program Files\PCL 1.5.1\3rdParty\Boost\include\boost/multi_index/sequenced_index.hpp(926) : error 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:语法错误:标识符“标签”1>C:\Program Files\PCL 1.5.1\ 3rdParty\Boost\include\boost/multi_index/ordered_index.hpp(1399) : error 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:语法错误:标识符 '标签' 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:语法错误:标识符“标签”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) : error 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;
}
Run Code Online (Sandbox Code Playgroud)
我想也许这表明Q_FOREACH
与 boost foreach的冲突。
但不知如何解决这个问题?
问题在于 Qt 定义了一个与命名空间冲突的foreach
宏 ( #define foreach Q_FOREACH
) boost::foreach
。
解决它的最简单方法是在 Qt 之前包含 Boost,或者在包含 boost 的头文件之前简单地取消定义 Qt 的宏。我更喜欢第二种,因为它不需要额外的文档 ( // remember to include Boost before Qt
),并且在嵌套头文件中以及如果使用预编译头文件中更容易管理。
#undef foreach
#include <boost/foreach.hpp>
Run Code Online (Sandbox Code Playgroud)
与禁用 Qt 的关键字(编译标志-DQT_NO_KEYWORDS
)相比,此选项的侵入性更小,并且可以仅在需要时应用于受影响的文件。它不会影响使用Q_FOREACH
(显然如果你使用Qt的foreach
它会失败)。它也可以独立工作,Qt 包含在 之前或之后<boost/foreach.hpp>
。
归档时间: |
|
查看次数: |
2847 次 |
最近记录: |