我是使用boost spirit的初学者。

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



通过使用以下规则(增强文档),这非常容易

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命名空间下:



而且我已经包含了这个标题。

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

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

最佳答案

您是supposed,可以使用<boost/spirit/include/...>中的 header ,以便Boost可以在其​​内部进行移位而不影响客户端代码。

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

真正的问题是您使用的命名空间-boost::spirit-与应该使用的命名空间-boost::spirit::classic

IIRC,当新的Spirit v2 API出现并试图修复Spirit "Header Hell"时,他们将以前的boost::spirit转换为boost::spirit::classic的几个版本。

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

namespace bspirit = boost::spirit::classic;

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

如果您不担心编译时间更长,并且不想弄清楚到底要使用哪个头文件,那么当然可以简单地使用#include <boost/spirit/include/classic.hpp>并完成它。 ;-)

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

10-16 12:29