gpt4 book ai didi

c++ - Boost MSM编译 boost

转载 作者:行者123 更新时间:2023-11-30 03:24:04 28 4
gpt4 key购买 nike

我正在尝试通过使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com