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)]
];