• <small id='kgKYE'></small><noframes id='kgKYE'>

    • <bdo id='kgKYE'></bdo><ul id='kgKYE'></ul>

    <legend id='kgKYE'><style id='kgKYE'><dir id='kgKYE'><q id='kgKYE'></q></dir></style></legend><tfoot id='kgKYE'></tfoot>
    1. <i id='kgKYE'><tr id='kgKYE'><dt id='kgKYE'><q id='kgKYE'><span id='kgKYE'><b id='kgKYE'><form id='kgKYE'><ins id='kgKYE'></ins><ul id='kgKYE'></ul><sub id='kgKYE'></sub></form><legend id='kgKYE'></legend><bdo id='kgKYE'><pre id='kgKYE'><center id='kgKYE'></center></pre></bdo></b><th id='kgKYE'></th></span></q></dt></tr></i><div id='kgKYE'><tfoot id='kgKYE'></tfoot><dl id='kgKYE'><fieldset id='kgKYE'></fieldset></dl></div>

        Spirit 无法为单元素结构(或融合序列)分配属性

        时间:2023-07-19

        <small id='mlhyf'></small><noframes id='mlhyf'>

                <tbody id='mlhyf'></tbody>
              • <bdo id='mlhyf'></bdo><ul id='mlhyf'></ul>
                  <legend id='mlhyf'><style id='mlhyf'><dir id='mlhyf'><q id='mlhyf'></q></dir></style></legend>

                  <i id='mlhyf'><tr id='mlhyf'><dt id='mlhyf'><q id='mlhyf'><span id='mlhyf'><b id='mlhyf'><form id='mlhyf'><ins id='mlhyf'></ins><ul id='mlhyf'></ul><sub id='mlhyf'></sub></form><legend id='mlhyf'></legend><bdo id='mlhyf'><pre id='mlhyf'><center id='mlhyf'></center></pre></bdo></b><th id='mlhyf'></th></span></q></dt></tr></i><div id='mlhyf'><tfoot id='mlhyf'></tfoot><dl id='mlhyf'><fieldset id='mlhyf'></fieldset></dl></div>
                  <tfoot id='mlhyf'></tfoot>
                  本文介绍了Spirit 无法为单元素结构(或融合序列)分配属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我的目标是让我的 qi::grammar 返回一个属性.不过,我在使用 spirit::lexer 时遇到了很大的困难.

                  My goal is to have my qi::grammar return an attribute. I'm having significant difficulty doing this with a spirit::lexer though.

                  我希望使用下面给定的语法,如果我用 spirit::qi::parse(begin, end,grammar, output); 调用它,structident 输出 将包含已解析词素的内容.

                  I'd expect that with the given grammar below, if I called it with spirit::qi::parse(begin, end, grammar, output);, that the struct ident output would have the contents of the parsed lexeme.

                  错误似乎主要是从这一行流出:start %= lexer.identifier;

                  The error seems to mostly flow out of this line: start %= lexer.identifier;

                  • 提升 1.47.0
                  • Mac OS X 10.7.2
                  • clang++ 或 g++(下面显示的错误来自 clang++)
                  g++ -g -c -O0 -Wall -DBOOST_SPIRIT_DEBUG -DBOOST_SPIRIT_LEXERTL_DEBUG -DBOOST_SPIRIT_USE_PHOENIX_V3 -DBOOST_SPIRIT_ACTIONS_ALLOW_ATTR_COMPAT reduced.cpp
                  

                  源代码

                  #include <boost/fusion/include/adapt_struct.hpp>
                  
                  #include <boost/spirit/home/lex.hpp>
                  #include <boost/spirit/home/lex/lexer/lexertl/lexer.hpp>
                  #include <boost/spirit/home/qi.hpp>
                  
                  namespace spirit = boost::spirit;
                  
                  struct ident {
                      std::string value;
                  };
                  
                  BOOST_FUSION_ADAPT_STRUCT(ident,
                          (std::string, value)
                          )
                  
                  struct my_lexer : spirit::lex::lexer< spirit::lex::lexertl::actor_lexer<> > {
                      spirit::lex::token_def<std::string> identifier;
                  };
                  
                  struct my_grammar : spirit::qi::grammar<my_lexer::iterator_type, ident()> {
                      my_grammar(const my_lexer & lexer) : my_grammar::base_type(start) {
                          start %= lexer.identifier;
                      }
                  
                      spirit::qi::rule<my_lexer::iterator_type, ident()> start;
                  };
                  

                  报告了 2 个错误

                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:38:24: error: no matching constructor for initialization of 'ident'
                                  attr = Attribute(first, last);
                                         ^         ~~~~~~~~~~~
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
                        void>::call' requested here
                              call(first, last, attr);
                              ^
                  In file included from ../reduced-example/reduced.cpp:4:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
                        requested here
                              spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
                              ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
                        boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
                              assign_to_attribute_from_value<Attribute, T>::call(val, attr);
                                                                            ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: in instantiation of function template specialization
                        'boost::spirit::traits::detail::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
                          detail::assign_to(val, attr, is_not_wrapped_container());
                          ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:106:21: note: in instantiation of function template specialization
                        'boost::spirit::traits::assign_to<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, ident>' requested here
                                      spirit::traits::assign_to(t, attr);
                                      ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:21:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/reference.hpp:16:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/reference.hpp:43:20: note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
                              return ref.get().parse(first, last, context, skipper, attr);
                                     ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
                  /home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
                        boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                      base_type(f)
                      ^
                  /home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
                        (boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                      self_type(f).swap(*this);
                      ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
                        (boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                              lhs.f = detail::bind_parser<Auto>(
                                    ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
                        'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
                        long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
                        boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
                              define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
                              ^
                  ../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
                        requested here
                                  start %= lexer.identifier;
                                        ^
                  ../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 2 were provided
                  struct ident {
                         ^
                  ../reduced-example/reduced.cpp:9:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 2 were provided
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:17:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/parser.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/domain.hpp:18:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/context.hpp:18:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/string_traits.hpp:16:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:368:22: error: no member named 'empty' in 'ident'
                              return c.empty();
                                     ~ ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/support/container.hpp:375:47: note: in instantiation of member function 'boost::spirit::traits::is_empty_container<ident, void>::call' requested here
                          return is_empty_container<Container>::call(c);
                                                                ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:37:17: note: in instantiation of function template specialization 'boost::spirit::traits::is_empty<ident>' requested here
                              if (traits::is_empty(attr))
                                  ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:94:13: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_iterators<ident, char const *,
                        void>::call' requested here
                              call(first, last, attr);
                              ^
                  In file included from ../reduced-example/reduced.cpp:4:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/lexer.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/lexertl/token.hpp:530:13: note: in instantiation of function template specialization 'boost::spirit::traits::assign_to<char const *, ident>'
                        requested here
                              spirit::traits::assign_to(t.value().begin(), t.value().end(), attr);
                              ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:13:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/lexer/token_def.hpp:20:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:330:59: note: in instantiation of member function 'boost::spirit::traits::assign_to_attribute_from_value<ident,
                        boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, void>::call' requested here
                              assign_to_attribute_from_value<Attribute, T>::call(val, attr);
                                                                            ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/detail/assign_to.hpp:353:9: note: (skipping 7 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
                          detail::assign_to(val, attr, is_not_wrapped_container());
                          ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:16:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function.hpp:64:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:67:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/function_iterate.hpp:14:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/function/detail/maybe_include.hpp:33:
                  /home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function4<bool,
                        boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &>::function4<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                      base_type(f)
                      ^
                  /home/wlynch/Boost/1.47.0/include/boost/function/function_template.hpp:1083:5: note: in instantiation of function template specialization 'boost::function<bool
                        (boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &)>::function<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                      self_type(f).swap(*this);
                      ^
                  In file included from ../reduced-example/reduced.cpp:3:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/lex/tokenize_and_parse.hpp:15:
                  In file included from /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/grammar.hpp:18:
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:19: note: in instantiation of function template specialization 'boost::function<bool
                        (boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>,
                        lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > &, boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *,
                        boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > > const &, boost::spirit::context<boost::fusion::cons<ident &,
                        boost::fusion::nil>, boost::fusion::vector0<void> > &, boost::spirit::unused_type const
                        &)>::operator=<boost::spirit::qi::detail::parser_binder<boost::spirit::lex::reference<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> const, unsigned long>, mpl_::bool_<1> > >'
                        requested here
                              lhs.f = detail::bind_parser<Auto>(
                                    ^
                  /home/wlynch/Boost/1.47.0/include/boost/spirit/home/qi/nonterminal/rule.hpp:230:13: note: in instantiation of function template specialization
                        'boost::spirit::qi::rule<boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<char const *, boost::mpl::vector0<mpl_::na>, mpl_::bool_<1>, unsigned
                        long>, lexertl::detail::data, char const *, mpl_::bool_<1>, mpl_::bool_<1> > >, ident (), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::define<mpl_::bool_<1>,
                        boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >' requested here
                              define<mpl::true_>(r, expr, traits::matches<qi::domain, Expr>());
                              ^
                  ../reduced-example/reduced.cpp:23:9: note: in instantiation of function template specialization 'boost::spirit::qi::operator%=<boost::spirit::lex::token_def<std::basic_string<char>, char, unsigned long> >'
                        requested here
                                  start %= lexer.identifier;
                                        ^
                  

                  推荐答案

                  我最终意识到我定义的结构体实际上被用作元组.因为 Spirit 会尽量减少组(例如,optionaloptional).因此,我猜测 tuple 将转换为 A.似乎是这样.

                  I ended up realizing that the struct I defined is being used in spirit as a tuple. Because spirit will try to minimize the groups (like, an optional<int, int> is an optional<int>). Therefore, I guessed that a tuple<A> will be converted to an A. Which seems to be the case.

                  我能够将损坏代码的测试用例进一步减少到以下内容:

                  I was able to further reduce the test case of broken code to the following:

                  #include <boost/fusion/include/adapt_struct.hpp>
                  #include <boost/spirit/home/qi.hpp>
                  #include <string>
                  
                  struct ident {
                      std::string a;
                  };
                  
                  BOOST_FUSION_ADAPT_STRUCT(ident,
                          (std::string, a)
                          )
                  
                  int main() {
                      boost::spirit::qi::rule<const char*, ident()> r;
                      r = boost::spirit::lexeme["abc"];
                  }
                  

                  来自以下邮件列表帖子(1、2),我可以通过以下方式解决这个问题:

                  From the following mailing list postings (1, 2) that I found, I can work around this issue by doing:

                  r = boost::spirit::lexeme["abc"] >> boost::spirit::eps;
                  

                  虽然不是很优雅,但至少解决了问题.如果其他人有一种方法来做单元素结构,我会非常感兴趣.

                  While not really elegant, it solves the problem at least. If someone else has a method to do the single element struct, I'd be greatly interested though.

                  这篇关于Spirit 无法为单元素结构(或融合序列)分配属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:ID 字段在自定义点类中间歇性丢失 下一篇:Boost Serialization Binary Archive 给出不正确的输出

                  相关文章

                  <tfoot id='vNxsV'></tfoot>
                  <legend id='vNxsV'><style id='vNxsV'><dir id='vNxsV'><q id='vNxsV'></q></dir></style></legend>

                      • <bdo id='vNxsV'></bdo><ul id='vNxsV'></ul>

                      <i id='vNxsV'><tr id='vNxsV'><dt id='vNxsV'><q id='vNxsV'><span id='vNxsV'><b id='vNxsV'><form id='vNxsV'><ins id='vNxsV'></ins><ul id='vNxsV'></ul><sub id='vNxsV'></sub></form><legend id='vNxsV'></legend><bdo id='vNxsV'><pre id='vNxsV'><center id='vNxsV'></center></pre></bdo></b><th id='vNxsV'></th></span></q></dt></tr></i><div id='vNxsV'><tfoot id='vNxsV'></tfoot><dl id='vNxsV'><fieldset id='vNxsV'></fieldset></dl></div>
                    1. <small id='vNxsV'></small><noframes id='vNxsV'>