我试图通过使用boost MSM状态机的显式模板实例化来减少项目的编译时间。但是每当我添加显式模板实例化时,我的项目都不会编译。
您可以使用此处文档中的示例找到问题的示例:http://coliru.stacked-crooked.com/a/9850cae23afdada2。 (这是一个人为的例子,因为只有一个翻译单元,但错误与我在项目中使用显式模板实例化时的错误相同。)
有人知道如何解决这些编译错误吗?
if ($_GET){
add_rewrite_rule(
"^$slug/(.+)$",
'index.php?post_type=xxx',
'top'
);
}
答案 0 :(得分:2)
由于some differences between how explicit and implicit instantiation work,您尝试做的事情不幸无效:
如果隐式实例化模板(就像使用状态机时通常那样),编译器不一定会为所有成员函数生成代码:
类模板特化的隐式实例化导致
- 未删除的类成员函数,成员类,作用域成员枚举,静态数据成员,成员模板和朋友的声明的隐式实例化,但不是定义的隐式实例化
C++ standard draft, [temp.inst/2]
当您显式实例化模板时(如上所述),编译器会将每个成员函数视为显式实例化,这意味着它也会尝试编译它们。
用于命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和作为模板的成员)的相同类型(声明或定义)的显式实例化 [。 ..]
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所述的访问者功能。 那使编译没有错误,虽然我不完全确定这些更改实际上有什么影响。