1

私は現在、私が使用するプロジェクトに取り組んでいます:

に関する問題に遭遇しましたconst_cast。私は高低を検索しましたが、私を助けることができる情報源をオンラインで見つけられませんでした. BOOST_FOREACHテストメソッド内で呼び出すと、問題が発生します。次のエラーが発生し続けます。

/usr/include/boost/foreach.hpp: In member function 
'boost::foreach_detail_::rvalue_probe<T>::operator T&() const [with T = 
boost::unordered_map<std::basic_string<char>, std::basic_string<char> >]':

...   instantiated from here /usr/include/boost/foreach.hpp:476:90: 
error: invalid cast from type 
Dereferee::const_cast_helper<boost::foreach_detail_::rvalue_probe<boost::unordered_map<std
::basic_string<char>, std::basic_string<char> > >*> 
to type 'boost::unordered_map<std::basic_string<char>, std::basic_string<char> >*

const_cast_helper

私は問題の分析を開始し、 const_cast 演算子がランタイム チェックの目的でオーバーロードされていることを発見しました。全体Dereferee::const_cast_helperとして、cxxtest 依存関係の一部である、const_cast 演算子のオーバーロードがあります。

このヘルパーは const_cast 演算子を定義解除します (!)

#ifdef const_cast
#undef const_cast
#endif

最後に const_cast 演算子を再導入します。

#define const_cast ::Dereferee::const_cast_helper

const_cast が呼び出されるたびに、このヘルパーの適切なコンストラクターが呼び出されるようにします。コンストラクターは、ポインター、参照、const ポインター、および const 参照を受け入れます。

ソースはこちら: https://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h

rvalue_probe

Boost はまた、反復されるコレクションが左辺値または右辺値であるかどうかを確認するためにキャストをいじり、それをコピーしたり式を再計算したりするのを回避します。

コンパイラは、次のように文句を言います。

template<typename T>
struct rvalue_probe
{
    ...
    operator T &() const { return *reinterpret_cast<T *>(const_cast<rvalue_probe *>(this)); }
};

私の場合、T は boost::unordered_map であり、どういうわけかこのキャストとヘルパーのオーバーロードの組み合わせが壊れています...

それを解決する方法は?

考えられる解決策を調べましたが、実際にそれらを実装する方法がわかりません。C++ の経験があまりありません。テストでこれらのコンパイル時のチェックを行うかどうかは少し気にしません。それを回避できます。したがって、3 つの方向のいずれかのヘルプが最も役立ちます。

  1. ブーストの右辺値チェックを無効にし、BOOST_WORKAROUND と foreach.hpp で定義されたリテラルで遊んでいます。

    BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION BOOST_FOREACH_NO_RVALUE_DETECTION BOOST_FOREACH_NO_CONST_RVALUE_DETECTION BOOST_FOREACH_RUN_TIME_CONST_RVALUE_DETECTION

  2. これを無効にしconst_cast_helperます。テスト プログラム (テスト プロジェクトとは別のプロジェクト) を実行すると、コードがコンパイルされて期待どおりに実行され、const_cast のオーバーロードによって問題が発生しました。

  3. このエラーを修正する拡張機能を実装します。でやるべきかどうかはわかりませんが、const_cast_helperrvalue_probeの役にも立ちませんでした。

template <typename T> const_cast_helper(rvalue_probe<U>* value_to_cast) : cast_value(const_cast<U*>(value_to_cast)) { }

事前にご入力いただきありがとうございます。

4

1 に答える 1

1

さらに掘り下げた後、なんとか回避策を見つけることができました。DEREFEREE_NO_CONST_CASTビルド構成にシンボルを定義しました。そのconst_cast_helperため、コンパイルできませんでした。バグが入り込まないことを願っています。テストは現在実行中です...

于 2013-08-09T15:16:23.100 に答える