Базовое назначение переменных в оболочке Swig не выполняется - PullRequest
2 голосов
/ 03 июня 2009

Я создал модуль 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 *'

Как будто выражение справа от '=' было объектом того же типа, что и элемент, содержащий поле данных для переназначения. Я уверен, что, должно быть, мне не хватает чего-то простого, но я уже несколько часов бьюсь головой о стену, но безрезультатно.

У кого-нибудь есть мысли? Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 июня 2009

Оказывается, это ошибка в SWIG. Я отправил отчет об ошибке, объясняющий причину проблемы .

Эта проблема была на самом деле из-за проблемы с вложенным пространством имен в сочетании с неправильным пониманием того, как SWIG работает с моей стороны. Я предполагал, что каждый элемент, который я ввел через% include в моем файле интерфейса, будет обрабатываться так, как gcc обрабатывает #include. Тем не менее, в файлах SWIG должен быть указан%% в порядке ссылки на их содержимое.

См. Связанный отчет об ошибках для уточнения.

0 голосов
/ 29 февраля 2012

Всегда будьте очень осторожны с заданиями с помощью SWIG! Обратите внимание, что функция operator = () используется только для собственных типов. Всякий раз, когда вы назначаете свои собственные объекты, копируется только адрес.

Подробнее об этом посте: SWIG C ++ to Python: Предупреждение (362): оператор = игнорируется

...