我在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的冲突。
但我不知道如何解决这个问题?
答案 0 :(得分:1)
设置编译器标志&Foo
,禁用boost和qt之间的冲突!
但是,您需要替换代码中的qt关键字,例如-DQT_NO_KEYWORDS
,slots
,signals
...,请参阅java nio tftp client。
(我在项目中引入boost :: multi_index容器时收到此消息。)
emit
执行此操作。)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>
之前或之后。