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 つのコンパイラの動作が異なる理由は何ですか?