2

尝试使用编译器编译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。任何想法为什么两个编译器的行为不同?

4

1 回答 1

0

我在本文档中找到了解决方案,请参阅http://www.boost.org/doc/libs/1_43_0/boost/foreach.hpp

片段:

// 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_FOREACH_NO_RVALUE_DETECTION定义选项时,错误消失了。

在这一点上 gcc 或 clang 是对还是错仍然存在问题。

于 2013-06-07T12:55:56.560 回答