编程语言
首页 > 编程语言> > c – 返回对自定义对象的引用时Boost.Python出错

c – 返回对自定义对象的引用时Boost.Python出错

作者:互联网

编辑:我注意到我的问题不够明确;我没有指定n0是Edge的属性.

我有两个类Nodes和Edges. Edge是定义的(我省略了许多不感兴趣的方法和属性):

class Edge()
{
  Node& n0;
public:
  const Node& N0() const;
};

访问器编码如下:

Node const& Edge::N0() const
{
  return n0;
};

其中n0是Node()实例的私有引用.问题是,在尝试使用以下代码公开此函数时:

class_<Edge>("Edge", init<Node&,Node&>())
    .add_property("n0",&Edge::N0,return_internal_reference<>());

(类Node在之前暴露)
我收到错误:

error: cannot create pointer to reference member ‘Edge::n0’

我可以让访问器返回n0的副本,它可以正常工作(测试).但是,如果n0非常重,我宁愿性能问题返回const引用而不是副本.

任何人都可以向我解释我在做什么是错的吗?我对C和Boost.Python很陌生,并且当然对调用策略还不太了解.

解决方法:

所以,我仍然不明白为什么我的原始程序或@ForEveR的解决方案不起作用,但我找到了一个解决方法,它给了我想要的东西.

首先,在定义边类的文件中,我定义了以下函数:

Node const& Edge_get_nodes(Edge& self)
{
   return self.N0(); 
};

我写的包装器:

class_<Edge>("Edge", init<Node&,Node&>())
   .add_property("length",&Edge::GetLength)
   .def("GetNode",&Edge_get_nodes,return_value_policy<reference_existing_object>());

现在,当我在python中导入模块时,我可以得到n0执行以下操作:

e1.GetNode()

这正是我想要的.谢谢你的帮助!

(如果有人可以向我解释为什么它会像这样工作而不是其他方式,我会很高兴知道!)

标签:boost-python,c,boost
来源: https://codeday.me/bug/20190902/1787303.html