使用boost spirit将字符串解析为struct

使用boost spirit将字符串解析为struct,boost,boost-spirit,string-parsing,boost-spirit-qi,boost-fusion,Boost,Boost Spirit,String Parsing,Boost Spirit Qi,Boost Fusion,我需要以下代码来解析字符串并将其移动到定义如下的结构: #include "boost\spirit\include\classic.hpp" #include "boost\spirit\include\qi.hpp" #include <boost/config/warning_disable.hpp> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix_co

我需要以下代码来解析字符串并将其移动到定义如下的结构:

#include "boost\spirit\include\classic.hpp"
#include "boost\spirit\include\qi.hpp"
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/filesystem.hpp>
#include <boost/format.hpp>
#include <regex>
#include <string>
#include <boost\chrono.hpp>
#include <ctype.h>
#include <iostream>

struct my_struct
{
   std::string s1;
   std::string s2;
   std::string s3;
   std::string s4;
   std::string s5;
   std::string s6;
   std::string s7;
   std::string s8;
   std::string s9;
   std::string s10;
   std::string s11;
};

BOOST_FUSION_ADAPT_STRUCT(
    my_struct,
    (std::string, s1 )
    (std::string, s2 )
    (std::string, s3 )
    (std::string, s4 )
    (std::string, s5 )
    (std::string, s6 )
    (std::string, s7 )
    (std::string, s8 )
    (std::string, s9 )
    (std::string, s10)
    (std::string, s11) 
)
#包括“boost\spirit\include\classic.hpp”
#包括“boost\spirit\include\qi.hpp”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构我的结构
{
std::字符串s1;
std::字符串s2;
std::字符串s3;
std::字符串s4;
std::字符串s5;
std::字符串s6;
std::字符串s7;
std::字符串s8;
std::字符串s9;
std::字符串s10;
std::字符串s11;
};
增强融合适应结构(
我的结构,
(标准::字符串,s1)
(std::string,s2)
(标准::字符串,s3)
(标准::字符串,s4)
(标准:字符串,s5)
(标准:字符串,s6)
(标准:字符串,s7)
(标准::字符串,s8)
(标准::字符串,s9)
(标准::字符串,s10)
(标准::字符串,s11)
)
我的语法是:

template <typename Iterator>
struct my_struct_parser : qi::grammar<Iterator, my_struct(), ascii::space_type>
{
    my_struct_parser() : my_struct_parser::base_type(start)
    {
        using ascii::char_;
        using qi::digit;
        using qi::alpha;

        start %=
            qi::alpha>>"-"
            >>qi::repeat(9)[digit]>>"-"
            >>+(digit)>>"-"
            >>+(digit)>>"-"
            >>+(digit)>>"-"
            >>qi::repeat(5)[digit]>>"-"
            >>+char_("a-zA-Z")>>"-"
            >>qi::repeat(2)[digit]>>"-"
            >>+(digit)>>"-"
            >>+(digit)>>"-"
           >>+(qi::alpha)

           >>-('-'>>+(char_("a-zA-Z0-9@$")));
    }
    qi::rule<Iterator, my_struct(), ascii::space_type> start;
};
模板
struct my_struct_解析器:qi::grammar
{
my_struct_parser():my_struct_parser::base_type(开始)
{
使用ascii::char;
使用qi::数字;
使用qi::alpha;
起始百分比=
qi::阿尔法>>“-”
>>qi::重复(9)[数字]>>“-”
>>+(数字)>>“-”
>>+(数字)>>“-”
>>+(数字)>>“-”
>>qi::重复(5)[数字]>>“-”
>>+字符(“a-zA-Z”)>>“-”
>>qi::重复(2)[数字]>>“-”
>>+(数字)>>“-”
>>+(数字)>>“-”
>>+(齐:阿尔法)
>>-('-'>>+(char_u2;(“a-zA-Z0-9@$”));
}
qi::规则开始;
};
然后我使用以下代码行解析字符串:

       my_struct & emp;//this is passed as an argument to a function
       typedef my_struct_parser<iterator_type> my_struct_parser_type;
       my_struct_parser_type parser;
       std::string::const_iterator iter = filename.begin();
       std::string::const_iterator end = filename.end();
       bool r =
       boost::spirit::qi::phrase_parse(iter, end,parser,boost::spirit::ascii::space ,emp);
my_struct&emp//这将作为参数传递给函数
typedef my_struct_parser my_struct_parser_type;
my_struct_parser_type parser;
std::string::const_迭代器iter=filename.begin();
std::string::const_迭代器end=filename.end();
布尔河=
boost::spirit::qi::短语解析(iter,end,parser,boost::spirit::ascii::space,emp);
好的,问题是当我的结构中有10个或更少的字段时,我的代码编译得很好,但是当我的结构中有更多的字段时,它会给出错误 ,所以我猜这是因为参数
SPIRIT\u ARGUMENTS\u LIMIT
,因为它的默认值是10

在包含spirit头文件之前,我尝试将此参数定义为我想要的大小,但仍然会出现编译错误


我应该如何解决这个问题?

如果您检查编译器抱怨的内容,您将看到如下内容:

....
/usr/include/boost/fusion/container/vector/convert.hpp:26:13: error: invalid use of incomplete type ‘struct boost::fusion::detail::as_vector<12>’
....
/usr/include/boost/fusion/container/vector/detail/as_vector.hpp:26:12: error: declaration of ‘struct boost::fusion::detail::as_vector<12>’
#define FUSION_MAX_VECTOR_SIZE      20
#define SPIRIT_ARGUMENTS_LIMIT      20