[C++-sig] python namespace

David Abrahams dave at boost-consulting.com
Thu Nov 21 23:40:01 CET 2002


"Bjorn Pettersen" <BPettersen at NAREX.com> writes:

>> From: David Abrahams [mailto:dave at boost-consulting.com] 
>> 
>> "Achim Domma" <achim.domma at syynx.de> writes:
>> 
>> >   scope drawable = scope(object(inner_module))
>> 
>> Why are you messing around with that approach when I already 
>> posted this correct one?
>> 
>>     scope drawable(object(inner_module));
>
> Now I'm confused... If I use the following code:
>
>   handle<> db_module(PyModule_New("db"));
>   scope().attr("db") = db_module;
>   scope db_scope = object(db_module);      /**/
>   class_<X>("X");
>
> X ends up in nrx.db (my main module is named nrx) and everything works
> as expected. If I change the line marked /**/ to:
>
>   scope db_scope(object(db_module));
>
> X ends up in nrx and there's an empty nrx.db. To add to the confusion, I
> thought:
>
>   A a = B(x);
>
> was equivalent to:
>
>   A a(B(x));

it is, unless A's constructor is explicit.

> is my C++ really that rusty?

Naw. Well, maybe. It's confusing. I was wrong, sorry. The correct line
is

   scope db_scope((object(db_module)));

The other one, without the extra parens, declares a function :(

To see that, note that the following compiles:

    struct scope {};
    struct object {};

    int main() {
       scope db_scope(object(db_module));

    }

Hmm, maybe it wasn't such a good idea to make scope's constructor
explicit. I give up!! Any suggestions for the proper interface to
scope will be gratefully considered!



-- 
                       David Abrahams
   dave at boost-consulting.com * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution





More information about the Cplusplus-sig mailing list