2017-07-10 7 views
-1

誰でもこのエラーをブーストで見たことがありますか?ブーストエラー: 'operator =='のあいまいなオーバーロード

私はCentOSの7上のGCC 7.1でブースト1.62と私のプロジェクトをコンパイルしていると私は

の下にコンパイルエラーを持っているが、それはブーストバグか何か他のものですか?もっとこのような

おかげ

boost/boost-1.62.0/include/boost/random/detail/polynomial.hpp: In member function ‘void boost::random::detail::polynomial::normalize()’: 
boost/boost-1.62.0/include/boost/random/detail/polynomial.hpp:352:45: error: ambiguous overload for ‘operator==’ (operand types are ‘boost::random::detail::polynomial::reference’ and ‘int’) 
    while(size() && (*this)[size() - 1] == 0) 
        ~~~~~~~~~~~~~~~~~~~~^~~~ 
boost/boost-1.62.0/include/boost/random/detail/polynomial.hpp:352:45: note: candidate: operator==(int, int) <built-in> 

xxx.h:393:17: note: candidate: bool operator==(const bool&, const CPolyVal&) 
STR_INLINE bool operator==(const TYPE& val, const CPolyVal& cpv)\ 
       ^
xxx.h:400:1: note: in expansion of macro ‘IMPLEMENT_RHS_COMPARE_TO’ 
IMPLEMENT_RHS_COMPARE_TO(bool) 
^~~~~~~~~~~~~~~~~~~~~~~~ 
xxx.h:393:17: note: candidate: bool operator==(const char&, const CPolyVal&) 
STR_INLINE bool operator==(const TYPE& val, const CPolyVal& cpv)\ 
       ^
xxx.h:401:1: note: in expansion of macro ‘IMPLEMENT_RHS_COMPARE_TO’ 
IMPLEMENT_RHS_COMPARE_TO(char) 
^~~~~~~~~~~~~~~~~~~~~~~~ 

たくさん。

エラーログが更新されました。

コードベースのどこかにあります。あなたはコメントで掲示何から判断

#define IMPLEMENT_RHS_COMPARE_TO(TYPE)\ 
STR_INLINE bool operator==(const TYPE& val, const CPolyVal& cpv)\ 
{\ 
    TYPE cpv_equiv_val;\ 
    return cpv.ConvertTo(cpv_equiv_val) == val;\ 
}\ 
// end macro 

IMPLEMENT_RHS_COMPARE_TO(bool) 
IMPLEMENT_RHS_COMPARE_TO(char) 
IMPLEMENT_RHS_COMPARE_TO(Int8) 
IMPLEMENT_RHS_COMPARE_TO(Int16) 
IMPLEMENT_RHS_COMPARE_TO(Int32) 
IMPLEMENT_RHS_COMPARE_TO(Int64) 
IMPLEMENT_RHS_COMPARE_TO(UInt8) 
IMPLEMENT_RHS_COMPARE_TO(UInt16) 
IMPLEMENT_RHS_COMPARE_TO(UInt32) 
IMPLEMENT_RHS_COMPARE_TO(UInt64) 
IMPLEMENT_RHS_COMPARE_TO(Float32) 
IMPLEMENT_RHS_COMPARE_TO(Float64) 
IMPLEMENT_RHS_COMPARE_TO(std::string) 
+0

は、多分それは 'でなければなりませんたまたましばらく((0 =サイズ())&&(0 ==(*これは)![サイズ() - 1]))' – VTT

+5

は、他の候補とは何ですか?あなたは1つだけを引用した。コンパイラは、他の候補が何であるか教えてくれましたか? – AnT

+0

@VTT読みにくくなることは別として、それは絶対に同等です... – Aconcagua

答えて

1

、あなたは何とかいくつかの侵入や、過度に広範なオーバーロードさ==演算子(テンプレート?)ブースト作者が意図した比較関数と競合を宣言することができました。この場合、Boostsは、ユーザ定義の変換演算子によって暗黙的にboolに変換されるように、左側のboost::random::detail::polynomial::referenceを意図します。一方、右側の0は、falseと解釈される必要があります。したがって、組み込みのintintの比較を使用して、2つのbool値を比較することが目的です。

あなたのオペレータ==は、その時点でブーストコードに明示的に表示され、あいまいさを引き起こします。例えば。そのようなことは

// Very loose and broad template comparison operator gets declared above 
// It can compare anything to `bool` 
template <typename T> bool operator ==(T lhs, bool rhs) 
{ 
    return false; 
} 

// Unsuspecting code begins here 
// It assumes that `S` vs. `int` comparisons will be interpreted as 
// built-in `bool` vs. `bool` comparisons 
struct S 
{ 
    operator bool() const { return false; } 

    void normalize() 
    { 
     S s; 
     s == 0; // Error: ambiguous comparison 
    } 
}; 
+0

はい、あなたは正しいです。エラーログも更新しました。だから、修正する可能性のある方法は何ですか?そのヘッダファイルを 'インクルード'チェーンから削除しますか?私たちの巨大なコードベースに非常に深く入れ子になっているインクルードチェーンがあるため、これを行うのはかなり難しいです。 –

+0

@daniel kim:最初に*あなたの*ヘッダーが常に* Boostヘッダーの後に*含まれていることを確認してから*前に*ブーストヘッダーを確認してください。これで解決できるかもしれません。確かに、これはかなり脆弱なアプローチですが、あなたのケースではうまくいくかもしれません。 – AnT

+0

また、 'CPolyVal'とは何ですか? – AnT

関連する問題