私は現在、私が使用するプロジェクトに取り組んでいます:
- ブースト ライブラリ v1.39
- Eclipse CDT (Juno) と Cygwin
- CxxTest プラグイン: http://wiki.web-cat.org/WCWiki/EclipsePlugins/CxxTestPlugin
に関する問題に遭遇しました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 参照を受け入れます。
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 つの方向のいずれかのヘルプが最も役立ちます。
ブーストの右辺値チェックを無効にし、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
これを無効にし
const_cast_helper
ます。テスト プログラム (テスト プロジェクトとは別のプロジェクト) を実行すると、コードがコンパイルされて期待どおりに実行され、const_cast のオーバーロードによって問題が発生しました。このエラーを修正する拡張機能を実装します。でやるべきかどうかはわかりませんが、
const_cast_helper
何rvalue_probe
の役にも立ちませんでした。
template <typename T> const_cast_helper(rvalue_probe<U>* value_to_cast) : cast_value(const_cast<U*>(value_to_cast)) { }
事前にご入力いただきありがとうございます。