Clang不编译g ++项目

时间:2013-06-05 15:49:22

标签: boost compiler-errors clang

尝试使用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

  • 编译文件 版本3.2中的
  • clang引发了上述错误

  • 已尝试包含导致相同错误的最新boost

我的猜测是clang处理rvalue条件的方式不同于此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编译此代码时没有错误。 任何想法为什么两个编译器的行为不同?

1 个答案:

答案 0 :(得分: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在这一点上是对还是错。