BOOST 1_55下Karma代码GCC4.8.3编译正常6.3.0报错求助
问题原因
- GCC 6.3.0默认启用C11标准编译,而你使用的Boost 1.55版本发布时未完全适配C11规范下的
boost::result_of类型推导逻辑,尤其是Spirit.Karma和Phoenix组件配合使用延迟参数时的类型推导存在兼容缺陷。 - 具体报错点来自代码中
karma::repeat(_r1)这一行:你使用规则继承属性_r1作为repeat的动态次数参数,C++11模式下Boost 1.55的result_of无法正确推导这个延迟计算表达式的返回类型,最终触发了no type named 'type' in 'struct boost::result_of<...>'错误。 - 旧版GCC 4.8.3默认使用C03标准编译,走了你代码中C03分支的逻辑,同时Boost 1.55对C++03场景的适配是完整的,所以可以正常编译。
解决方案
按改造成本从低到高排序:
- 强制使用TR1版result_of
编译时添加编译参数-DBOOST_RESULT_OF_USE_TR1,强制Boost使用兼容旧版的TR1风格result_of实现,不需要修改任何业务代码即可解决绝大多数同类兼容问题。 - 强制使用C++03标准编译
编译时添加参数-std=c++03,让GCC 6.3.0使用和旧版4.8.3一致的C++03规范编译,完全兼容原有代码逻辑,适合临时赶工不想调整代码的场景。 - 代码层修正类型推导
把代码中报错的karma::repeat(_r1)修改为karma::repeat(boost::phoenix::eval(_r1)),显式声明该参数为延迟求值表达式,帮助Boost完成类型推导。 - 升级Boost版本
升级Boost到1.57及以上版本,该版本开始官方完全修复了C++11下Spirit、Phoenix组件的result_of兼容问题,不需要修改原有代码即可正常编译。
内容的提问来源于stack exchange,提问作者newbieToCivilization
相关产品推荐
相关产品推荐

