- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过使用 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;
~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
...
最佳答案
不幸的是,由于 some differences between how explicit and implicit instantiation work,您正在尝试做的事情不起作用。 :
如果您隐式实例化一个模板(就像您通常在使用状态机时所做的那样),编译器不一定会为所有成员函数生成代码:
The implicit instantiation of a class template specialization causes
- the implicit instantiation of the declarations, but not of the definitions, of the non-deleted class member functions, member classes, scoped member enumerations, static data members, member templates, and friend
C++ standard draft, [temp.inst/2]
当您显式实例化一个模板时(正如您在上面尝试的那样),编译器会将每个 成员函数视为已显式实例化,这意味着它也会尝试编译它们。
An explicit instantiation that names a class template specialization is also an explicit instantiation of the same kind (declaration or definition) of each of its members (not including members inherited from base classes and members that are templates) [...]
C++ standard draft, [temp.explicit/10]
在这种特殊情况下,区别在于 get_deferred_queue
成员函数。它只会在 deferred_msg_queue_helper
提供特定成员时编译,只有当您的状态支持延迟事件时才会出现这种情况。通常,您不会调用该函数,因此编译器永远不会尝试实例化然后编译它。但是,显式实例化使编译器尝试在您的状态机中编译 get_deferred_queue
,但失败了。显然,this is desired standard behavior ,因此唯一的解决方法是在状态机中支持延迟事件,如 in the documentation 所述
不幸的是,您很可能会遇到通常在编译时关闭的其他功能的其他问题。我遇到的下一个问题涉及 visit_current_states
函数 - 为了解决这个问题,我必须添加一个具有访问者功能的自定义基本状态,如 here 所述。 . 这使其编译时没有错误,尽管我不完全确定这些更改实际会产生什么影响。
关于c++ - Boost MSM编译 boost ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016570/
假设我有 2 个状态,一个事件状态和一个空闲状态。如果我在 Active 状态下收到一些事件,我想推迟它们并在我返回 Idle 状态时执行它们。 但是当我回到空闲状态时,有没有办法选择要处理哪个先前延
我有一个像这样的状态机: class FsmDef : public boost::msm::front::state_machine_def { private: Args args;
我是 boost 元状态库的新手。我正在构建一个应用程序,我必须在其中使用 msm。 我的应用程序有两个线程,它们使用相同的 msm 对象作为共享资源。如果两个线程都在同一个 msm 对象上调用 pr
我有一个实时循环,我需要根据我所处的状态进行每次迭代的工作。 我正在使用 Boosts Meta State Machine 库来实现我的状态机。根据我所处的状态调用函数的最佳方法是什么? 假设我有一
我想知道是否有一种方法可以直接安装msm而不需要创建另一个安装项目? 最佳答案 这是不可能的。 MSM 包的目的是共享资源,例如 VC++ 可再发行组件,您可以将其包含在应用程序的安装程序中,例如先决
我有一个更大的站点,它使用 MSM 分成子域。这些站点中的每一个都有自己的一组员工来管理该部分。我的想法是创建成员组来反射(reflect)这些员工组,并为他们分配对每个子域的适当访问权限。每个子域都
我尝试使用 boost::MSM 实现一个简单的状态机以进行测试。有几个事件必须按正确的顺序处理,所以我推迟了目前不允许的其他事件。我尝试推迟转换表中的事件,以便在一个地方寻找它,尽管要查看所有状态,
在 boost::msm 的文档中有一个 example没有默认构造函数的状态机。我可以让它在我直接从 super SM 跳到子 SM 的地方工作。但是当我从一个子 SM 跳转到另一个子 SM 时,目
我的问题更像是一个架构问题。我有多个相同类型的状态机。说 controller_type1_sm controller1; controller_type2_sm controller2; std::
我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的一些 C++/伪代码。 bool operator()(Event const& evt, FSM & fsm, SourceS
我在使用 boost::msm 实现子子状态机时遇到了一些麻烦。我试图在这里最小化我的代码... 测试.cpp: struct SM_ : StateMachineA {}; // Pick a ba
以下代码是仿函数前端的 boost msm 文档中给出的示例。 #include #include // back-end #include //front-end #include //
网络上的任何地方似乎都没有关于如何执行此操作的分步过程记录。如果提到它,它的文档记录很差,我无法遵循他们建议的复杂路径。我是 ClickOnce 的新手,我已经能够让我的 c# 程序在用户机器上正确安
我想使用 boost msm 状态机,但我很难想象它是如何工作的。假设我们只有 2 个状态(s1,s2),要从 s1 到 s2,您需要触发事件 e1 并返回,您需要另一个 e2。e1 和 e2 只能分
我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在此状态机中,有两类事件 class1 和 class2。 class1 事件可以由状态 S1 或 S2 处理,而 class2 事件
当我触发 process_event("eventname") 时,如何检查状态转换是否发生或是否调用了 no_transition? 基本上,我希望触发/调用 process_event("even
我使用 MSM 插件在两个不同的域名上运行两个 ExpressionEngine 站点。站点一包含所有系统文件等,站点二位于站点一的子文件夹中。我的问题是如何让站点 2 在 url 中没有它的 ind
我正在使用 Windows Installer XML (WiX) 工具集创建发行版。我想将 Visual C++ Redistributable 添加到包中。这里 http://wix.source
我正在熟悉 MSM boost 库。我发现这真的很有趣 questions关于加入几个正交状态。 此外,我在 boost 文档中找到了一种在父状态机中重用子状态机的方法,并且我编写了几个简单的嵌套状态
我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“ManualMove”、“AutoMove”、“Work”、“Idle”等……但是,我需要能够从任何状态强行停止机器人,将其置于无法
我是一名优秀的程序员,十分优秀!