On Friday 17 December 2010 17:43:02 John Cummings wrote:
> On 12/17/2010 19:35, John Cummings wrote:
> > My apologies for the long email. Just to not bore everyone, I'll send
> > two messages. The first one quickly summarizing my observations and
> > questions. In the next one, I'll reply to myself with the details.
> >
> > I am able to use a class inside a namespace if I use this general
> > pattern in the header file:
> >
> > namespace bar {
> >
> > class foo;
> >
> > }
> > class bar::foo {
> >
> > ...
> >
> > };
> >
> > However, I cannot get things to work using this pattern:
> >
> > namespace bar {
> >
> > class foo {
> >
> > ...
> >
> > };
> >
> > }
> >
> > Has anyone else seen this behavior? Is there another way to have a bind
> > a class that is inside a C++ namespace?
> >
> > Yes, I read the namespace type in the typesystem documentation:
> >
> > http://www.pyside.org/docs/apiextractor/typesystem_specifying_types.html#
> > namespace-type
> >
> > That document seems to indicate that you cannot have classes in a
> > namespace. To quote: "Note that within namespaces, the generator only
> > supports enums (i.e., no functions or classes)." So, I understand that
> > the answer may be that it is impossible right now. I am just perplexed
> > why it works one way and not the other.
>
> Now for the gory details. First, I am tried all of these things on
> OpenSuse 11.3, 64-bit with Qt 4.6.3 and PySide beta1. I am trying to
> wrap an existing C++ library and thus started with the PySide Binding
> Generation Tutorial here:
>
> http://developer.qt.nokia.com/wiki/PySide_Binding_Generation_Tutorial
>
> The initial steps worked just fine and I generally understand them. I
> even started trying to wrap an existing library. However, the existing
> library has most of its classes in a C++ namespace. That didn't work the
> first time. As a test, I took a class out of the namespace and
> everything seemed to work just fine. However, I do not want to repeat
> this process for every class in the library.
>
> So, to better understand things, I modified the libfoo example to move
> the Math class in the C++ namespace bar. My first iteration is the
> typical way many coders (meaning me) put classes in a namespace, namely
> in foo.h:
>
> namespace bar {
> class Math : public QObject
> {
> Q_OBJECT
> public:
> Math() {}
> virtual ~Math() {}
> int squared(int x);
> };
> } //end namespace bar
>
> and then I foo.cpp we have:
>
> int bar::Math::squared(int x)
> {
> return x * x;
> }
>
> That causes several things to change and ultimately not work. My first
> clue was a warning from the bindings generator that said, "type
> 'bar::Math' is specified in typesystem, but not defined. This could
> potentially lead to compilation errors." That warning caused me to add a
> namespace-type line to the typesystem file like so:
>
> <namespace-type name="bar" />
>
> That addition silenced the warning. Next, I noticed that the binding
> generator also chooses different names for its output files such that I
> had to change CMakeLists.txt file as follows:
>
> bar_math_wrapper.cpp instead of math_wrapper.cpp
>
> With that change, everything compiles fine. However, when trying to
> run the python test script, it fails with an error about an undefined
> symbol that said, "ImportError: .../foo.so: undefined symbol:
> _Z8init_barP7_object."
>
> I then went through several failed attempts to compile in the new
> bar_wrapper.cpp that the generator also created. As I said, none of
> those worked, so I eventually tried again by redoing foo.h as follows:
Why you can't compile bar_wrapper.cpp!? What errors happened?
> namespace bar {
> class Math;
> }
> class bar::Math : public QObject
> {
> Q_OBJECT
> public:
> Math() {}
> virtual ~Math() {}
> int squared(int x);
> };
>
> With this change along with prefixing the class with "bar::" in the
> typesystem.xml file and the resulting file names changes in the
> CMakeLists.txt file, everything works as you would expect.
>
> So, that leads me to my questions again. Why does it work with the
> forward declaration syntax but not the inline syntax? My best guess
> would be a generator parser limitation based on the warning message.
> However, I have not attempted to delve into the code at all.
We need to known the problems you had trying to compile bar_wrapper.cpp,
because libfoo uses inline namespaces and works.
> I would be happy to send my modified files, which are purposefully not
> much different than the libfoo example.
>
> Thank you
> John Cummings
>
> _______________________________________________
> PySide mailing list
> [email protected]
> http://lists.openbossa.org/listinfo/pyside
--
Hugo Parente Lima
INdT - Instituto Nokia de Tecnologia
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ PySide mailing list [email protected] http://lists.openbossa.org/listinfo/pyside
