Ускорение компиляции MSM

Я пытаюсь сократить время компиляции моего проекта, используя явное создание экземпляров шаблона для ускоренного конечного автомата 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

Решение

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

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

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

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

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

Черновик стандарта C ++, [temp.inst / 2]

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

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

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

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

С МСМ

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

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

2

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

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

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