c++ - 为了在提升精神中使用 limit_d 指令,我应该包含哪些头文件?

标签 c++ parsing boost-spirit

我是使用boost spirit的初学者。

我想做的只是解析一个具有以下格式的时间的文本:

HH:MM::SS

这很容易通过使用以下规则(提升文档)

uint_parser<int, 10, 2, 2> uint2_p;

r = lexeme_d
    [
        boost::spirit::limit_d(0u, 23u)[uint2_p] >> ':' 
        >>  boost::spirit::limit_d(0u, 59u)[uint2_p] >> ':' 
        >>  boost::spirit::limit_d(0u, 59u)[uint2_p]           
    ];

问题是我收到一个编译器错误,指出 limit_d 不是 boost spirit 命名空间的成员,即使 limit_d 指令位于以下 header 中的 boost::spirit 命名空间下:

boost/spirit/home/classic/core/composite/directives.hpp

我已经包含了这个标题。

所以我对应该包含哪个 header 以便编译代码感到困惑(我使用的是 VS2013)

附言我的代码在没有 limit_d 指令的情况下也能正常工作,所以问题肯定是由 limit_d 引起的。

最佳答案

你是supposed使用 <boost/spirit/include/...> 中的 header ,以便 Boost 可以在不影响客户端代码的情况下改变其内部结构。

包括<boost/spirit/include/classic_directives.hpp>然而,它只是使用的包装器,因此除了忽略一层抽象之外,您的 header 没有任何问题。

真正的问题是您使用的命名空间 -- boost::spirit -- 对比你应该使用的那个 -- boost::spirit::classic .

IIRC,他们转移了前者 boost::spirit进入boost::spirit::classic几个版本之前,当新的 Spirit v2 API 出现时,他们试图修复 Spirit "Header Hell" .

#include <boost/spirit/include/classic_directives.hpp>

namespace bspirit = boost::spirit::classic;

int main()
{
    bspirit::limit_d( 0u, 23u );
}

如果您不担心较长的编译时间并且不想弄清楚要确切使用哪个 header ,您当然可以简单地#include <boost/spirit/include/classic.hpp>并完成它。 ;-)

关于c++ - 为了在提升精神中使用 limit_d 指令,我应该包含哪些头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073898/

相关文章:

c++ - C++ sans cmath库中的GCD函数

c++ - 错误: no matching function for call to 'function namel'

java - 在Android项目中使用HTML解析器

python - 如何在 python 中编写标签删除器脚本

c++ - 为什么这个 boost::spirit::qi 规则不能成功解析?

c++ - boost spirit 解析

c++ - Boost Spirit语法eol

c++ - 成员函数替代名称

javascript - 请从此字符串中提取一些信息(没有正则表达式,以便我可以理解)

c++ - Windows 任务管理器显示进程虚拟内存的哪一部分