Базовое назначение переменных, обернутых swig, не выполняется

StackOverflow https://stackoverflow.com/questions/941626

  •  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):оператор = игнорируется

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top