boost :: spirit 1.53 multi_pass迭代器相关的编译错误

时间:2013-06-18 09:33:08

标签: c++ boost-spirit-qi

代码:

typedef std::string::const_iterator iterator;
namespace parsers
{
    namespace spirit = ::boost::spirit;
    namespace ascii = ::boost::spirit::ascii;
    namespace phoenix = ::boost::phoenix;
    spirit::qi::rule< iterator, void(std::string), ascii::space_type > action_parser = 
        '"'
        > spirit::qi::lit("action")
        > spirit::qi::labels::_r1
        > '"';
}

错误:

> 1>CL : warning : This header is deprecated. Please use:
> boost/spirit/include/classic.hpp
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/multi_pass_fwd.hpp(59):
> error C2976: 'boost::spirit::multi_pass' : too few template arguments
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/multi_pass_fwd.hpp(86):
> error C3203: 'multi_pass' : unspecialized class template can't be used
> as a template argument for template parameter 'Iterator', expected a
> real type
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/multi_pass_fwd.hpp(86):
> error C2955: 'boost::spirit::multi_pass' : use of class template
> requires template argument list
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/multi_pass_fwd.hpp(86):
> error C2977: 'boost::spirit::traits::is_multi_pass' : too many
> template arguments
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/multi_pass.hpp(183):
> error C2976: 'boost::spirit::multi_pass' : too few template arguments
> 1>D:\CPP\boost\boost_1_53_0\boost_1_53_0\boost/spirit/home/support/iterators/istream_iterator.hpp(37):
> error C2955: 'boost::spirit::multi_pass' : use of class template
> requires template argument list

2 个答案:

答案 0 :(得分:2)

  

问:我删除了boost / spirit.hpp。原因是什么?附:感谢FoReVer

A。:这是因为

  

CL:警告:不推荐使用此标头。请用:   
&GT;升压/精神/包含/ classic.hpp

换句话说:它告诉你究竟为什么。这就像正常生活一样转化为正常生活。

现在了解开发人员弃用旧标题的原因:

  

维基百科 Deprecation

     

弃用是指应用于计算机软件功能,特征或实践的状态,表明应该避免,通常是因为被取代

而且你有它:“通常是因为被取代”。在这种情况下,SpiritV2在2009年左右取代了SpiritV1(?)。这就是文档中所说的:

  

Spirit Classic

     
    

Spirit V1.8.x代码库已与Spirit V2集成。它现在被称为Spirit.Classic。由于目录结构已更改(Spirit Classic标头现在已移至$ BOOST_ROOT / boost / spirit / home / classic目录),因此我们创建了转发标头,允许现有应用程序无需任何更改即可进行编译。

         

但是,不推荐使用这些转发标头,这将导致为每个以Boost V1.38开头的标头生成相应的警告。预计将来会删除转发标头。

         

现在使用Spirit Classic的推荐方法是在$ BOOST_ROOT / boost / spirit / include目录中包含头文件。此目录中的所有Spirit Classic标题都以其名称前缀为“classic_”。

  

总而言之,它只是意味着:精神经典是旧的。不要使用它。

如果您继承了Spirit V1解析器并需要有关迁移到Spirit V2的指导:

注意:我们说话时,SpiritX3已经在开发中。见here

答案 1 :(得分:0)

我删除了boost / spirit.hpp包含。 为什么会这样?

礼貌FoReVer