Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为了在boost spirit中使用limit_d指令,我应该包括哪些头文件?_C++_Parsing_Boost Spirit - Fatal编程技术网

C++ 为了在boost spirit中使用limit_d指令,我应该包括哪些头文件?

C++ 为了在boost spirit中使用limit_d指令,我应该包括哪些头文件?,c++,parsing,boost-spirit,C++,Parsing,Boost Spirit,我是一个使用boost spirit的初学者 我要做的就是解析一个时间为以下格式的文本: HH:MM::SS 通过使用以下规则(boost文档),这非常容易 uint\u解析器uint2\p; r=词素d [ 精神:极限(0u,23u)[uint2\u p]>>“:” >>精神:极限(0u,59u)[uint2\u p]>>“:” >>精神:极限(0u,59u)[uint2\u p] ]; 问题是,我收到一个编译器错误,指出limit\u d不是boost-spirit命名空间的成员,即使li

我是一个使用
boost spirit
的初学者

我要做的就是解析一个时间为以下格式的文本:

HH:MM::SS

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

uint\u解析器uint2\p;
r=词素d
[
精神:极限(0u,23u)[uint2\u p]>>“:”
>>精神:极限(0u,59u)[uint2\u p]>>“:”
>>精神:极限(0u,59u)[uint2\u p]
];
问题是,我收到一个编译器错误,指出
limit\u d
不是
boost-spirit
命名空间的成员,即使
limit\u d
指令位于以下标题中的
boost::spirit
命名空间下:

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

我已经包括了这个标题

因此,我对应该包含哪个头才能编译代码感到困惑(我使用的是VS2013)

另外,我的代码在没有
limit\u d
指令的情况下工作正常,因此问题肯定是由
limit\u d
引起的。您要使用
中的标题,以便Boost可以在不影响客户端代码的情况下在其内部进行转换

include
不过是您所使用的文件的包装,因此,除了忽略一层抽象之外,您的头没有任何问题

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

IIRC,当新的spirit v2 API问世并试图修复spirit时,他们将原来的
boost::spirit
转换为
boost::spirit::classic
几个版本

#包括
命名空间bspirit=boost::spirit::classic;
int main()
{
bspirit::极限d(0u,23u);
}

如果您不害怕更高的编译时间,也不想弄清楚到底要使用哪个头,那么您当然可以简单地
#包括
,然后使用它

使用@DevSolar发布的答案,我可以看到
limit\u d
,但这将引入另一个编译错误,说明我们无法使用它

boost::spirit::qi::uint_parser<int, 10, 2, 2> uint2_p;
因此,时间分析器规则如下所示:

boost::spirit::classic::uint_parser<uint16, 10, 2, 2>           uint2_p;
boost::spirit::qi::rule<std::string::const_iterator, Time(), qi::space> Time_;

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

从示例中,他们没有限定名称就调用了它……如果您发布了一篇文章,我可以看看它与我的工作代码有什么不同,并在回答中写出差异。既然你没有费心去写MCVE,我也不想把我的代码变成MCVE。看到了吗?谢谢@NathanOliver纠正错误。我知道调用它的示例没有限定名称,但是我已经尝试过了,编译错误变为“'limit_d':identifier not found”或RRR只是使用了过去十年中某个地方支持的库的一个版本:)“几个版本之前”有点用词不当。它认为这是大约20个版本以前的事了。@sehe:如果我个人没有采取严厉措施,我的公司仍然会坚持我们的一款产品使用ICU 3.6和Boost 1.34.1,因为“这就是我们测试的内容”。:-D
boost::spirit::qi::uint_parser<int, 10, 2, 2> uint2_p;
boost::spirit::classic::uint_parser<uint16, 10, 2, 2> uint2_p;
boost::spirit::classic::uint_parser<uint16, 10, 2, 2>           uint2_p;
boost::spirit::qi::rule<std::string::const_iterator, Time(), qi::space> Time_;

Time_ = lexeme_d
    [
            boost::spirit::classic::limit_d(0u, 23u)[uint2_p] >> ':'
        >>  boost::spirit::classic::limit_d(0u, 59u)[uint2_p] >> ':'
        >>  boost::spirit::classic::limit_d(0u, 59u)[uint2_p]
    ];
    namespace qi = boost::spirit::qi;
    struct Time
    {
        unsigned Hour;
        unsigned Minute;
        unsigned Second;
    };

    boost::spirit::qi::rule<std::string::const_iterator, Time(), qi::space> Time_;

    Time_ = lexeme_d
        [
                    qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 23)] >> ':'
                >>  qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 59)] >> ':'
                >>  qi::uint_[qi::_pass = (0 <= qi::_1 && qi::_1 <= 59)]
        ];