我是使用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/