sle*_*eur 3 c++ boost boost-msm
我试图通过使用 boost 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;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于显式实例化和隐式实例化的工作方式之间存在一些差异,您尝试做的事情不起作用:
如果您隐式实例化模板(就像使用状态机时通常所做的那样),编译器不一定会为所有成员函数生成代码:
类模板特化的隐式实例化导致
- 未删除类成员函数、成员类、作用域成员枚举、静态数据成员、成员模板和友元的声明的隐式实例化,但不是定义的隐式实例化
当您显式实例化模板时(如上面尝试的那样),编译器会将每个成员函数视为显式实例化,这意味着它也会尝试编译这些成员函数。
命名类模板专门化的显式实例化也是其每个成员(不包括从基类继承的成员和模板成员)的同类(声明或定义)的显式实例化[...]
在这种特殊情况下,差异在于get_deferred_queue成员函数。deferred_msg_queue_helper仅当提供特定成员时才会编译,只有您所在的州支持延迟事件时才会出现这种情况。通常,您不会调用该函数,因此编译器永远不会尝试实例化然后编译它。但是,显式实例化使编译器尝试get_deferred_queue在状态机中进行编译,但失败了。显然,这是所需的标准行为,因此唯一的解决方法是支持状态机中的延迟事件,如文档中所述
不幸的是,您很可能会遇到通常在编译时关闭的其他功能的其他问题。我遇到的下一个问题涉及该visit_current_states功能 - 为了解决这个问题,我必须添加具有访问者功能的自定义基本状态,如此处所述。这使得它编译时没有错误,尽管我不完全确定这些更改实际上会产生什么影响。
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |