То, что вы пытаетесь сделать, к сожалению, не работает из-за некоторых различий между тем, как работает явная и неявная реализация :
Неявная реализация
Если вы выполняете неявную реализациюшаблон (как обычно при использовании конечного автомата), компилятор не обязательно будет генерировать код для всех функций-членов:
Неявное создание экземпляра специализации шаблона класса приводит к
- неявное создание деклараций, но не определений, неотчеркнутых функций-членов класса, классов-членов, перечислений членов с областью действия, статических членов-данных, шаблонов элементов и друга
Стандартный черновик C ++, [temp.inst / 2]
Явное создание экземпляра
Когда вы явно создаете экземпляр шаблона (каквы пробовали выше), компилятор будет обрабатывать каждую функцию-член как явно созданную, что означает, чтоЯ постараюсь также скомпилировать их.
Явное создание экземпляра, который называет специализацию шаблона класса, также является явным созданием экземпляра одного и того же вида (объявление или определение) каждого из его членов (не включая унаследованных членов).из базовых классов и членов, которые являются шаблонами) [...]
C ++ стандартный черновик, [temp.explicit / 10]
С MSM
В этом конкретном случае разница заключается в функции-члене get_deferred_queue
.Он будет компилироваться только в том случае, если deferred_msg_queue_helper
предлагает определенного участника, что имеет место только в том случае, если ваши штаты поддерживают отложенные события.Обычно вы не вызываете эту функцию, поэтому компилятор никогда не пытается создать экземпляр, а затем скомпилировать его.Однако явное создание экземпляра заставляет компилятор попытаться - и не может - скомпилировать get_deferred_queue
на вашем конечном компьютере.Очевидно, это желаемое стандартное поведение , поэтому единственный обходной путь для вас - это поддержка отложенных событий в вашем автомате состояний, как описано в документации
К сожалению, этоВполне возможно, что у вас возникнут дополнительные проблемы с другими функциями, которые обычно отключаются во время компиляции.Следующая проблема, с которой я столкнулся, связана с функцией visit_current_states
- чтобы исправить это, мне пришлось добавить пользовательское базовое состояние с функциональностью посетителя, как описано здесь . То, что заставило его скомпилироваться без ошибок, хотя я не совсем уверен, какое влияние на самом деле имеют эти изменения.