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ます。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)

そのため、-DBOOST_FOREACH_NO_RVALUE_DETECTIONclang に定義オプションを指定すると、エラーは表示されなくなります。

この点に関しては、gcc や clang が正しいか間違っているかという疑問が残ります。

于 2013-06-07T12:55:56.560 に答える