尝试使用编译器编译g++
项目时clang
,出现一个奇怪的错误。
这是源文件的片段:
std::set<TTransportNetworkId> l_transportNetworkIds;
SelectionResultContainer l_searchResult = p_repo.rootMoc() / LnAny("LNBTS") / LnAny("LNMME");
BOOST_FOREACH(const SelectionResult & l_lnmmeSR, l_searchResult)
{
const MoLnmme & l_lnmme = l_lnmmeSR;
l_transportNetworkIds.insert(*l_lnmme.transportNwId);
}
错误信息是:
conditional expression is ambiguous; 'rvalue_probe<Rrom::DataRep::SelectionResultContainer>' can be converted to 'Rrom::DataRep::SelectionResultContainer' and vice versa
BOOST_FOREACH(const SelectionResult & l_lnmmeSR, l_searchResult)
条件是:
该文件编译得很好
gcc_4.3.2
clang
在 3.2 版本中抛出上述错误已经尝试包含
boost
导致相同错误的最新库
我的猜测是clang
处理右值条件的方式与这个gcc
版本不同。
clang
应该是 的替代品gcc
,那么如何在不接触源文件的情况下摆脱这个错误呢?
是否有任何选项clang
可以以某种方式禁用此类错误?!
更新: 我可以创建一个示例源文件,您可以自己复制:
#include <vector>
#include <boost/foreach.hpp>
class A : public std::vector<int>
{
public:
template <class T>
operator const T &() const;
};
void foo(){
A colA;
int b = 1;
BOOST_FOREACH(b, colA)
{
;
}
}
编译时clang 3.2
出现上述错误,并对错误发生的确切位置有一些额外的见解:
error: conditional expression is ambiguous; 'rvalue_probe<A>' can be converted to 'A' and vice versa BOOST_FOREACH(b, colA)
expanded from macro 'BOOST_FOREACH' f (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL))
expanded from macro 'BOOST_FOREACH_CONTAIN' BOOST_FOREACH_EVALUATE(COL)
expanded from macro 'BOOST_FOREACH_EVALUATE' (true ? boost::foreach_detail_::make_probe((COL), BOOST_FOREACH_ID(_foreach_is_rvalue)) : (COL))
此代码编译时没有错误gcc_4.7.2
。任何想法为什么两个编译器的行为不同?