Boost Clang不编译g++;项目

Boost Clang不编译g++;项目,boost,compiler-errors,clang,Boost,Compiler Errors,Clang,当试图用clang编译器编译g++项目时,出现了一个奇怪的错误 以下是源文件的片段: std::set<TTransportNetworkId> l_transportNetworkIds; SelectionResultContainer l_searchResult = p_repo.rootMoc() / LnAny("LNBTS") / LnAny("LNMME"); BOOST_FOREACH(const SelectionResult & l_lnmme

当试图用
clang
编译器编译
g++
项目时,出现了一个奇怪的错误

以下是源文件的片段:

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);
    }
使用
clang3.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))
错误:条件表达式不明确;'rvalue\u probe'可以转换为'A',反之亦然(b,colA)
从宏“BOOST\u FOREACH”f展开(BOOST::FOREACH\u detail\u::auto\u任意BOOST\u FOREACH\u ID(\u FOREACH\u col)=BOOST\u FOREACH\u CONTAIN(col))
从宏“BOOST\u FOREACH\u CONTAIN”BOOST\u FOREACH\u EVALUATE(COL)展开
从宏“BOOST\u FOREACH\u EVALUATE”(true?BOOST::FOREACH\u detail\u::make\u probe((COL),BOOST\u FOREACH\u ID(\u FOREACH\u is\r值)):(COL))展开
使用
gcc_4.7.2
编译此代码时没有错误。
你知道为什么这两个编译器的行为不同吗?

我在本文中找到了解决方案,请参阅

片段:

// Some compilers do not correctly implement the lvalue/rvalue conversion
// rules of the ternary conditional operator.
# if defined(BOOST_FOREACH_NO_RVALUE_DETECTION)
因此,当为clang提供
-DBOOST\u FOREACH\u NO\u RVALUE\u DETECTION
定义选项时,错误消失


问题仍然在于GCC或CLAN在这一点上是对还是错。

你可以考虑发布一个链接到一个使用。你也可以使用<代码> STD::FuyAuth/<代码>,甚至是一个简单的基于循环的范围,而不是依赖于Boost。
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))
// Some compilers do not correctly implement the lvalue/rvalue conversion
// rules of the ternary conditional operator.
# if defined(BOOST_FOREACH_NO_RVALUE_DETECTION)