<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>[PyQt] Using own module in SIP interface as parameter</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->
<BR>

<P><FONT SIZE=2>I'm currently working on replacing a custom PyQt module with a custom<BR>
Qt module. Before I'm diving in I thought I'd create a HelloWorld<BR>
testcase. But for some reason I can't get it to work properly. My<BR>
question is, how should I create a single Python-SIP module containing<BR>
two classes in which one takes the other as parameter when<BR>
instantiating?<BR>
<BR>
An overview of what I've got untill now:<BR>
Class A takes an object of class B as parameter (see a.cpp below).<BR>
I've included b.h in a.h in order for a to be able to see b. Both c++<BR>
modules compile and issuing ldd shows b is properly linked into a.<BR>
Since the SIP interface must also contain a description of this<BR>
constructor it also needs to know about both classes a and b.<BR>
Therefore I've included a.h and b.h in their respective SIP files.<BR>
<BR>
But when I issue make on the SIP files I keep running into circular<BR>
import errors:<BR>
In file included from b.sip:7:<BR>
./b.h:3: error: redefinition of ‘class HW::B’<BR>
./b.h:3: error: previous definition of ‘class HW::B’<BR>
make: *** [sipAHWA.o] Error 1<BR>
<BR>
Obviously that is because both a.h and b.h are included and a.h<BR>
includes b.h. But removing either an include or adding a %Import b.sip<BR>
makes me run around in circles. It's either a redefinition, or SIP<BR>
can't find the specification of B. What am I overlooking?<BR>
<BR>
My files:<BR>
b.h<BR>
-----------------------------<BR>
namespace HW {<BR>
class B {<BR>
public:<BR>
       B();<BR>
};<BR>
}<BR>
<BR>
b.cpp<BR>
-----------------------------<BR>
#include "b.h"<BR>
namespace HW {<BR>
int B() {<BR>
}<BR>
}<BR>
<BR>
a.h<BR>
-----------------------------<BR>
#include "b.h"<BR>
<BR>
namespace HW {<BR>
class A {<BR>
public:<BR>
       A(B b);<BR>
};<BR>
}<BR>
<BR>
a.cpp<BR>
-----------------------------<BR>
#include "a.h"<BR>
namespace HW {<BR>
int A(B b) {<BR>
<BR>
}<BR>
}<BR>
<BR>
a.sip<BR>
-----------------------------<BR>
%Module A 0<BR>
<BR>
namespace HW {<BR>
class A {<BR>
<BR>
%TypeHeaderCode<BR>
#include <a.h><BR>
%End<BR>
<BR>
public:<BR>
       A(HW::B b);<BR>
};<BR>
};<BR>
<BR>
b.sip<BR>
-----------------------------<BR>
%Module B 0<BR>
<BR>
namespace HW{<BR>
class B {<BR>
<BR>
%TypeHeaderCode<BR>
#include <b.h><BR>
%End<BR>
<BR>
public:<BR>
       B();<BR>
};<BR>
};<BR>
<BR>
helloworld.sip<BR>
-----------------------------<BR>
%Module HelloWorld<BR>
<BR>
%Include b.sip<BR>
%Include a.sip</FONT>
</P>

</BODY>
</HTML>