Ускорение компиляции MSM - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь сократить время компиляции моего проекта, используя явное создание экземпляров шаблона для конечного автомата MSM. Однако всякий раз, когда я добавляю явную реализацию шаблона, мой проект не компилируется.

Пример проблемы можно найти, используя пример из документации здесь: http://coliru.stacked -crooked.com / a / 9850cae23afdada2 . (Это надуманный пример, поскольку существует только одна единица перевода, но ошибки такие же, как и в случае, когда я использую явную реализацию шаблона в моем проекте.)

Кто-нибудь знает, как решить эти ошибки компиляции?

/usr/local/include/boost/msm/back/state_machine.hpp: In instantiation of 'boost::msm::back::state_machine<A0, A1, A2, A3, A4>::deferred_events_queue_t& boost::msm::back::state_machine<A0, A1, A2, A3, A4>::get_deferred_queue() [with A0 = player_; A1 = boost::parameter::void_; A2 = boost::parameter::void_; A3 = boost::parameter::void_; A4 = boost::parameter::void_; boost::msm::back::state_machine<A0, A1, A2, A3, A4>::deferred_events_queue_t = std::deque<std::pair<boost::function<boost::msm::back::HandledEnum()>, bool>, std::allocator<std::pair<boost::function<boost::msm::back::HandledEnum()>, bool> > >]':
main.cpp:271:27:   required from here
/usr/local/include/boost/msm/back/state_machine.hpp:1346:40: error: 'struct boost::msm::back::state_machine<player_>::deferred_msg_queue_helper<boost::msm::back::state_machine<player_>, int>' has no member named 'm_deferred_events_queue'
         return m_deferred_events_queue.m_deferred_events_queue;
                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...

1 Ответ

0 голосов
/ 03 мая 2018

То, что вы пытаетесь сделать, к сожалению, не работает из-за некоторых различий между тем, как работает явная и неявная реализация :

Неявная реализация

Если вы выполняете неявную реализациюшаблон (как обычно при использовании конечного автомата), компилятор не обязательно будет генерировать код для всех функций-членов:

Неявное создание экземпляра специализации шаблона класса приводит к

  • неявное создание деклараций, но не определений, неотчеркнутых функций-членов класса, классов-членов, перечислений членов с областью действия, статических членов-данных, шаблонов элементов и друга

Стандартный черновик C ++, [temp.inst / 2]

Явное создание экземпляра

Когда вы явно создаете экземпляр шаблона (каквы пробовали выше), компилятор будет обрабатывать каждую функцию-член как явно созданную, что означает, чтоЯ постараюсь также скомпилировать их.

Явное создание экземпляра, который называет специализацию шаблона класса, также является явным созданием экземпляра одного и того же вида (объявление или определение) каждого из его членов (не включая унаследованных членов).из базовых классов и членов, которые являются шаблонами) [...]

C ++ стандартный черновик, [temp.explicit / 10]

С MSM

В этом конкретном случае разница заключается в функции-члене get_deferred_queue.Он будет компилироваться только в том случае, если deferred_msg_queue_helper предлагает определенного участника, что имеет место только в том случае, если ваши штаты поддерживают отложенные события.Обычно вы не вызываете эту функцию, поэтому компилятор никогда не пытается создать экземпляр, а затем скомпилировать его.Однако явное создание экземпляра заставляет компилятор попытаться - и не может - скомпилировать get_deferred_queue на вашем конечном компьютере.Очевидно, это желаемое стандартное поведение , поэтому единственный обходной путь для вас - это поддержка отложенных событий в вашем автомате состояний, как описано в документации

К сожалению, этоВполне возможно, что у вас возникнут дополнительные проблемы с другими функциями, которые обычно отключаются во время компиляции.Следующая проблема, с которой я столкнулся, связана с функцией visit_current_states - чтобы исправить это, мне пришлось добавить пользовательское базовое состояние с функциональностью посетителя, как описано здесь . То, что заставило его скомпилироваться без ошибок, хотя я не совсем уверен, какое влияние на самом деле имеют эти изменения.

...