gpt4 book ai didi

python - 没有默认构造函数的对象成员的 Swig setter

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:47 25 4
gpt4 key购买 nike

Swig 为没有默认构造函数的对象成员生成包装器代码。

包装代码:

class Foo {
public:
Foo (int i);
};

Class Bar {
public:
Bar(int i):foo(i)
{
...
}
Foo foo;
};

Swig Setter 生成:

SWIGINTERN PyObject *_wrap_Bar_foo_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
Bar *arg1 = (Bar *) 0 ;
Foo arg2 ; // -> swig generates a call to a non existing default constructor

...

然后,如果尝试编译包装器,我会收到错误消息,因为默认构造函数不存在:

error: no matching function for call to ‘Foo::Foo()’

请注意,对 getter 生成采用相同的方法。

我如何告诉 swig 生成接受 Foo* 或 Foo& 的 setter?

谢谢,巴勃罗

最佳答案

SWIG 从根本上很好地支持这一点,事实上我无法用您展示的代码重现您所看到的内容。例如,这一切都有效:

%module test

%inline %{
class Foo {
public:
Foo (int i) {}
};

class Bar {
public:
Bar(int i):foo(i)
{
}
Foo foo;
};
%}

当使用 SWIG 3.0.2(现在已经很老了!)编译并运行时,让我运行这段 Python 代码:

import test

f=test.Foo(0)

b=test.Bar(0)
b.foo=f
print('Well that all worked ok')

即使在更一般的情况下,这也能起作用的原因是因为 feature known as the "Fulton Transform" .从本质上讲,这是为了解决缺少复制构造函数的问题,方法是将其包装在另一个对象中。 (尽管在特定实例中你已经表明它实际上什至不需要)。

无论如何,尽管这应该会自动应用,但在某些情况下它不会自动应用。幸运的是,即使它不会自动工作,您也可以使用 %feature

强制启用它

所有你需要做的就是在你的 .i 文件中,在第一次声明/定义一个没有复制构造函数的类型之前的某个地方包含以下内容:

%feature("valuewrapper") Foo;

就是这样。

关于python - 没有默认构造函数的对象成员的 Swig setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56480792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com