jjzjj

c++ - spirit::qi :将继承的属性引用传递给 phoenix::function

coder 2024-02-05 原文

以下代码是我正在尝试做的事情的简化版本。基本上,我有结构(玩具代码中的 int_holder)和一个容器数据成员。我想插入一个对象(在本例中为 int)并向父 qi::rule 返回一个指向新插入对象的指针。

我通过引用将 int_holder 传递给语法,以便在解析时用值填充它,因此 int_holder 将是语法的继承属性。代码:

#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_function.hpp>
#include <vector>

namespace qi=boost::spirit::qi;
namespace phoenix=boost::phoenix;

struct int_holder
{
    int_holder() {}
    std::vector<int> ints;
};


struct insert_impl
{
    template<class, class>
    struct result { typedef int* type; };
    int* operator() (int_holder& holder, int i) const
    {
        holder.ints.push_back (i);
        return &holder.ints.back();
    }
};

template<class Iterator>
struct my_grammar : qi::grammar<Iterator, int*(int_holder&)>
{
    my_grammar () : my_grammar::base_type (start)
          , insert (insert_impl())
    {
        using qi::_val;
        using qi::int_;
        using qi::_r1;
        using qi::_1;

        using phoenix::ref;

        start = +next(_val) [_val = _1];
        next = int_ [_val = insert(_r1, _1)];
    }
    qi::rule<Iterator, int*(int_holder&)> start, next;
    phoenix::function<insert_impl> insert;
};


int main ()
{
    using phoenix::ref;

    const char* p="1";
    int* last;
    int_holder holder;
    my_grammar<const char*> g;
    qi::parse (p, p+1, g(ref(holder)), last);
}

代码编译不通过,错误信息如下:

In file included from     
/opt/local/include/boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp:16:0,
         from /opt/local/include/boost/fusion/sequence/intrinsic/begin.hpp:17, from
         /opt/local/include/boost/fusion/iterator/segmented_iterator.hpp:12, from
         /opt/local/include/boost/fusion/sequence/intrinsic/detail/segmented_end.hpp:11, from
         /opt/local/include/boost/fusion/sequence/intrinsic/end.hpp:17, from
         /opt/local/include/boost/fusion/sequence/intrinsic/back.hpp:11, from
         /opt/local/include/boost/fusion/sequence/intrinsic.hpp:11, from
         /opt/local/include/boost/fusion/include/intrinsic.hpp:10, from
         /opt/local/include/boost/proto/fusion.hpp:22, from
         /opt/local/include/boost/proto/core.hpp:21, from
         /opt/local/include/boost/proto/proto.hpp:12, from
         /opt/local/include/boost/spirit/home/support/meta_compiler.hpp:19, from
         /opt/local/include/boost/spirit/home/qi/meta_compiler.hpp:14, from
         /opt/local/include/boost/spirit/home/qi/action/action.hpp:14, from
         /opt/local/include/boost/spirit/home/qi/action.hpp:14, from
         /opt/local/include/boost/spirit/home/qi.hpp:14, from
         /opt/local/include/boost/spirit/include/qi.hpp:16, from test_qi.cpp:1:
         /opt/local/include/boost/fusion/container/list/cons.hpp: In instantiation of
         'boost::fusion::cons<Car, Cdr>::cons(const boost::fusion::cons<Car2, Cdr2>&) [with Car2 =
         int*&; Cdr2 = boost::fusion::nil; Car = int_holder&; Cdr = boost::fusion::nil]':
         /opt/local/include/boost/spirit/home/support/context.hpp:117:20: required from
         'boost::spirit::context<Attributes, Locals>::context(typename Attributes::car_type, const
         Args&, Context&) [with Args =
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_>; Context = boost::spirit::context<boost::fusion::cons<int*&,
         boost::fusion::cons<int_holder&, boost::fusion::nil> >, boost::fusion::vector0<> >;
         Attributes = boost::fusion::cons<int*&, boost::fusion::cons<int_holder&,
         boost::fusion::nil> >; Locals = boost::fusion::vector0<>; typename Attributes::car_type =
         int*&]' /opt/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:343:67: required
         from 'bool boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::parse(Iterator&, const
         Iterator&, Context&, const Skipper&, Attribute&, const Params&) const [with Context =
         boost::spirit::context<boost::fusion::cons<int*&, boost::fusion::cons<int_holder&,
         boost::fusion::nil> >, boost::fusion::vector0<> >; Skipper = boost::spirit::unused_type;
         Attribute = int*; Params =
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_>; Iterator = const char*; T1 = int*(int_holder&); T2 =
         boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 =
         boost::spirit::unused_type]'
         /opt/local/include/boost/spirit/home/qi/nonterminal/detail/parameterized.hpp:48:79:
         required from 'bool boost::spirit::qi::parameterized_nonterminal<Subject,
         Params>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const
         [with Iterator = const char*; Context = boost::spirit::context<boost::fusion::cons<int*&,
         boost::fusion::cons<int_holder&, boost::fusion::nil> >, boost::fusion::vector0<> >;
         Skipper = boost::spirit::unused_type; Attribute = int*; Subject =
         boost::spirit::qi::rule<const char*, int*(int_holder&), boost::spirit::unused_type,
         boost::spirit::unused_type, boost::spirit::unused_type>; Params =
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_>]' /opt/local/include/boost/spirit/home/qi/action/action.hpp:65:13:
         required from 'bool boost::spirit::qi::action<Subject, Action>::parse(Iterator&, const
         Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = const char*;
         Context = boost::spirit::context<boost::fusion::cons<int*&,
         boost::fusion::cons<int_holder&, boost::fusion::nil> >, boost::fusion::vector0<> >;
         Skipper = boost::spirit::unused_type; Attribute = boost::spirit::unused_type; Subject =
         boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const char*,
         int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> >; Action =
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         >]' /opt/local/include/boost/spirit/home/qi/detail/fail_function.hpp:38:72: required from
         'bool boost::spirit::qi::detail::fail_function<Iterator, Context,
         Skipper>::operator()(const Component&, Attribute&) const [with Component =
         boost::spirit::qi::action<boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const
         char*, int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> >,
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         > >; Attribute = boost::spirit::unused_type; Iterator = const char*; Context =
         boost::spirit::context<boost::fusion::cons<int*&, boost::fusion::cons<int_holder&,
         boost::fusion::nil> >, boost::fusion::vector0<> >; Skipper = boost::spirit::unused_type]'
         /opt/local/include/boost/spirit/home/qi/detail/pass_container.hpp:263:38: [ skipping 10
         instantiation contexts ] /opt/local/include/boost/function/function_template.hpp:1042:16:
         required from 'boost::function<R(T0, T1, T2, T3)>::function(Functor, typename
         boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,
         int>::type) [with Functor =
         boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::action<boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const
         char*, int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> >,
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         > > >, mpl_::bool_<false> >; R = bool; T0 = const char*&; T1 = const char* const&; T2 =
         boost::spirit::context<boost::fusion::cons<int*&, boost::fusion::cons<int_holder&,
         boost::fusion::nil> >, boost::fusion::vector0<> >&; T3 = const
         boost::spirit::unused_type&; typename
         boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,
         int>::type = int]' /opt/local/include/boost/function/function_template.hpp:1083:5:
         required from 'typename
         boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,
         boost::function<R(T0, T1, T2, T3)>&>::type boost::function<R(T0, T1, T2,
         T3)>::operator=(Functor) [with Functor =
         boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::action<boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const
         char*, int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> >,
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         > > >, mpl_::bool_<false> >; R = bool; T0 = const char*&; T1 = const char* const&; T2 =
         boost::spirit::context<boost::fusion::cons<int*&, boost::fusion::cons<int_holder&,
         boost::fusion::nil> >, boost::fusion::vector0<> >&; T3 = const
         boost::spirit::unused_type&; typename
         boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,
         boost::function<R(T0, T1, T2, T3)>&>::type = boost::function<bool(const char*&, const
         char* const&, boost::spirit::context<boost::fusion::cons<int*&,
         boost::fusion::cons<int_holder&, boost::fusion::nil> >, boost::fusion::vector0<> >&,
         const boost::spirit::unused_type&)>&]'
         /opt/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:13: required from
         'static void boost::spirit::qi::rule<Iterator, T1, T2, T3,
         T4>::define(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, const Expr&, mpl_::true_)
         [with Auto = mpl_::bool_<false>; Expr =
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
         boost::proto::argsns_::list1<const
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,
         boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
         boost::proto::argsns_::term<boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const
         char*, int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> > >, 0l>&,
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
         boost::proto::argsns_::term<const
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         >&>, 0l> >, 2l>&>, 1l>; Iterator = const char*; T1 = int*(int_holder&); T2 =
         boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 =
         boost::spirit::unused_type; boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> =
         boost::spirit::qi::rule<const char*, int*(int_holder&), boost::spirit::unused_type,
         boost::spirit::unused_type, boost::spirit::unused_type>; mpl_::true_ =
         mpl_::bool_<true>]' /opt/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:220:13:
         required from 'boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&
         boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::operator=(const Expr&) [with Expr =
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
         boost::proto::argsns_::list1<const
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,
         boost::proto::argsns_::list2<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
         boost::proto::argsns_::term<boost::spirit::qi::parameterized_nonterminal<boost::spirit::qi::rule<const
         char*, int*(int_holder&), boost::spirit::unused_type, boost::spirit::unused_type,
         boost::spirit::unused_type>,
         boost::fusion::vector<boost::phoenix::actor<boost::spirit::attribute<0> >,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_> > >, 0l>&,
         boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
         boost::proto::argsns_::term<const
         boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::assign_eval,
         boost::fusion::vector<boost::spirit::attribute<0>, boost::spirit::argument<0>,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_,
         boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, boost::fusion::void_> >
         >&>, 0l> >, 2l>&>, 1l>; Iterator = const char*; T1 = int*(int_holder&); T2 =
         boost::spirit::unused_type; T3 = boost::spirit::unused_type; T4 =
         boost::spirit::unused_type; boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> =
         boost::spirit::qi::rule<const char*, int*(int_holder&), boost::spirit::unused_type,
         boost::spirit::unused_type, boost::spirit::unused_type>]' test_qi.cpp:41:3: required from
         'my_grammar<Iterator>::my_grammar() [with Iterator = const char*]' test_qi.cpp:57:26:
         required from here /opt/local/include/boost/fusion/container/list/cons.hpp:83:40: error:
         invalid initialization of reference of type 'boost::fusion::cons<int_holder&,
         boost::fusion::nil>::car_type {aka int_holder&}' from expression of type 'int*'

将_r1 传递给phoenix::function 时显然有问题,但我不知道如何解决。提前致谢。

最佳答案

对不起,我刚刚发现错误,那行代码

start = +next(_val) [_val = _1];

需要改成

start = +next(_r1) [_val = _1];

然后就可以了。抱歉浪费您的时间!再见!

关于c++ - spirit::qi :将继承的属性引用传递给 phoenix::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333487/

有关c++ - spirit::qi :将继承的属性引用传递给 phoenix::function的更多相关文章

  1. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  5. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  6. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  7. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  8. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

随机推荐