[PyKDE] namespaces in sip

Patrick Stinson ajole-1 at gci.net
Thu Oct 16 09:32:00 BST 2003


...and now if we have something like 

namespace PK
{
class Port
{  
  enum Type
  {
    Input,
    Output
  };
  PK_Port(PK_Port::Type);
};

};

we should get an error because of the nested [enum], correct? hope not...

On Wednesday 15 October 2003 22:29, Jim Bublitz wrote:
> On Wednesday October 15 2003 14:46, Patrick Stinson wrote:
> > a.h
> > ----------------------------------
> > namespace PK
> > {
> > class A {};
> > }
> >
> > b.h
> > ------------------------------------
> > namespace PK
> > {
> > class B{};
> > }
> >
> > pkmod.sip
> > -----------------------------------
> > %Module PK
> > %Include a.sip
> > %Include b.sip
> >
> > a.sip
> > -------------------------------------
> > /* same as a.h */
> >
> > b.sip
> > -------------------------------------
> > /* same as b.h */
> >
> >
> > I'm working on modifying my sip project to include a lot of
> > classes all contained in the same C++ namespace. What is the
> > correct way to organize the sip files? Do all classes in the
> > namespace have to be declared within the namespace in the same
> > sip file?
>
> No - as in C++, namespaces are extensible. Classes (in sip files)
> aren't (nested classes have to be defined within the parent
> definition's scope).
>
> > Right now I have added the namespace decl and brackets in each
> > class' sip file, all of which are included in the module file,
> > just like in PyQt. When it's like this, I get a sip parse
> > error on the line including the second file with a namespace
> > decl.
>
> One of two possibilities (I'm not sure which at the moment).
> First, I believe sip wants to see '};' end a namespace, not just
> '}', so you can try that first.  Actually, there is no "second"
> - I was going to question whether sip allows two namespace decls
> in a single file, but I just added a sip file to PyKDE that does
> that and it works. I'd go for the semicolon.
>
> Otherwise, the only thing you need to be aware of is that sip
> won't accept any implicit scoping, so for example:
>
> namespace a
> {
>     class c
>     {
>     public:
>             c ();
>             c (c&); # wrong - should be c (a::c&);
>     };
> };
>
> will tell you that 'c' is undefined in the  second constructor.
> You need to use "a::c" *everywhere* c is referenced except in
> class, ctor and dtor names - even within the namespace a and
> even within class c. Enums declared within the namespace must be
> referenced everywhere with fully-qualified names also.
>
> Unfortunately, sip won't really tell you c is undefined in the
> second ctor, just that c is undefined - if you have a lot of
> namespace'd stuff, it can take a long time to get all of the
> names right if a lot of them use implicit naming.
>
> In Python if you do:
>
>     from <module> import a
>
> you can then do:
>
>     x = a.c ()
>
> since importing the namespace imports all of its members.
>
>
> Jim
>
> _______________________________________________
> PyKDE mailing list    PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde




More information about the PyQt mailing list