Проблемы приведения с помощью BOOST_FOREACH и плагина cxxtest

В настоящее время я работаю над проектом, в котором я использую:

и я столкнулся с проблемой, касающейся 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, вызывается соответствующий конструктор этого помощника. Конструкторы принимают указатели, ссылки, константные указатели и константные ссылки.

Источник здесь: https://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h

rvalue_probe

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 ++. Мне наплевать, будут ли эти тесты во время компиляции в моих тестах, я могу обойти это. Таким образом, любая помощь в любом из трех направлений будет наиболее полезной!

  1. Отключение проверки 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

  2. Отключение этого const_cast_helper, Когда я запускаю свои тестовые программы (проект, отличный от тестового), мой код компилируется и запускается, как и ожидалось, перегрузка const_cast создала проблемы.

  3. Реализация расширения, которое исправит эту ошибку. Я не знаю, следует ли это делать в 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)) { }

Спасибо за ваш вклад заранее!

1

Решение

После еще нескольких копаний мне удалось найти обходной путь. Я определил символ DEREFEREE_NO_CONST_CAST в моей конфигурации сборки. Что помешало const_cast_helper от компиляции. Надеюсь, никаких ошибок не возникнет, тесты запущены …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]