swig包装变量的基本赋值失败。

我使用swig创建了一个包装了大量C++类的lua模块。这些包装器生成和编译时(使用-Wall)没有任何问题。然而,在我找到的几个地方,我遇到了以下问题:成员数据的基本赋值失败。

如果我运行:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require('myModule')
> a = myModule.ClassA()

然后我可以验证附加到“a”的元表包含了它的所有成员数据(在这种情况下是ClassB和ClassC两个类类型字段“b”和“c”)

我进一步执行:

> a.b = myModule.ClassB()

这将b成功重新分配给ClassB()的一个新实例。但是,当我要执行:

> a.b.c = myModule.ClassC()

我会收到以下错误消息:

错误在ClassB_c_set(arg 2)中,期望'ClassC *',得到'ClassB *'

就好像“=”号右边的表达式是与包含要重新分配的数据字段的元素类型相同的对象一样。我肯定必须漏掉了一些简单的东西,但我已经撞了几个小时的墙了,没有任何结果。

有人有任何想法吗?谢谢!

原文链接 https://stackoverflow.com/questions/941626

点赞
stackoverflow用户109549
stackoverflow用户109549

原来这是 SWIG 的一个 bug。我已经提交了 一个 bug 报告,解释了问题的原因

实际上,这个问题是由嵌套命名空间问题和我对 SWIG 工作方式的误解导致的。我原以为在接口文件中通过 %include 引入的每个条目都会像 gcc 处理 #includes 一样被处理。然而,在 SWIG 中,文件必须按它们所包含的内容被引用的顺序 %included

请参见链接的 bug 报告以获得更清晰的解释。

2009-06-03 15:04:38
stackoverflow用户768115
stackoverflow用户768115

始终要非常小心使用 SWIG 进行分配!

请注意,operator=() 函数仅用于本机类型。每当您分配自己的对象时,只有地址被复制。

阅读更多关于此帖子的内容:SWIG C++ 转 Python:警告(362):operator= 被忽略

2012-02-29 09:31:26