В настоящее время я работаю над проектом, в котором я использую:
и я столкнулся с проблемой, касающейся 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 перегружен с целью некоторой проверки во время выполнения, я не знаю что. В общем, есть 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, вызывается соответствующий конструктор этого помощника. Конструкторы принимают указатели, ссылки, константные указатели и константные ссылки.
Источник здесь: https://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h
Boost также играет с приведениями, чтобы увидеть, является ли перебираемая коллекция lvalue или rvalue, чтобы избежать ее копирования / пересчета выражения.
Компилятор жалуется на следующее:
template<typename T>
struct rvalue_probe
{
...
operator T &() const { return *reinterpret_cast<T *>(const_cast<rvalue_probe *>(this)); }
};
В моем случае, T является boost :: unordered_map и как-то сочетает это приведение и разрывы перегрузки помощника …
Я изучил возможные решения, но я не знаю, как на самом деле их реализовать, у меня нет такого большого опыта C ++. Мне наплевать, будут ли эти тесты во время компиляции в моих тестах, я могу обойти это. Таким образом, любая помощь в любом из трех направлений будет наиболее полезной!
Отключение проверки rvalue в boost, игра с 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)) { }
Спасибо за ваш вклад заранее!
После еще нескольких копаний мне удалось найти обходной путь. Я определил символ DEREFEREE_NO_CONST_CAST
в моей конфигурации сборки. Что помешало const_cast_helper
от компиляции. Надеюсь, никаких ошибок не возникнет, тесты запущены …
Других решений пока нет …