Базовое назначение переменных, обернутых swig, не выполняется
-
06-09-2019 - |
Вопрос
Я создал модуль lua с очень большим количеством обернутых классов C++, используя swig.Обертки генерируются и компилируются (с -Wall) без каких-либо проблем.Однако в нескольких местах, которые я нашел, я столкнулся со следующей проблемой:базовое назначение данных элемента завершается неудачей.
Если я бегу:
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require('myModule')
> a = myModule.ClassA()
Затем я могу убедиться, что метатаблица, прикрепленная к «a», содержит все данные ее элементов (в данном случае поля «b» и «c» типа класса ClassB и ClassC соответственно.)
Я могу еще сделать:
> a.b = myModule.ClassB()
который успешно переназначает b новому экземпляру ClassB().Однако, когда я собираюсь сделать:
> a.b.c = myModule.ClassC()
Я получаю сообщение об ошибке:
Error in ClassB_c_set (arg 2), expected 'ClassC *' got 'ClassB *'
Как будто выражение в правой части знака «=» было объектом того же типа, что и элемент, содержащий переназначаемое поле данных.Я уверен, что, должно быть, упускаю что-то простое, но я уже несколько часов бился головой о стену, но безрезультатно.
У кого-нибудь есть мысли?Спасибо!
Решение
Оказывается, это ошибка SWIG.я отправил отчет об ошибке, объясняющий причину проблемы.
На самом деле эта проблема возникла из-за проблемы с вложенным пространством имен в сочетании с непониманием того, как работает SWIG с моей стороны.Я предполагал, что каждый элемент, который я ввел через %include в мой файл интерфейса, будет обрабатываться так же, как gcc обрабатывает #includes.Однако в SWIG-файлах необходимо указывать %include в том порядке, в котором упоминается их содержимое.
См. связанный отчет об ошибке для разъяснений.
Другие советы
Всегда будьте очень осторожны с задания с помощью SWIG!Обратите внимание, что оператор=() функция используется только для собственных типов.Всякий раз, когда вы назначаете свои собственные объекты, копируется только адрес.
Подробнее читайте в этом посте: SWIG C++ на Python:Предупреждение(362):оператор = игнорируется