Template bug?

Artyom Shalkhakov artyom.sh at gmail.ru
Mon Jan 29 21:36:37 PST 2007


Jarrett Billingsley Wrote:

> "Artyom Shalkhakov" <artyom.sh at gmail.ru> wrote in message 
> news:epmho3$282d$1 at digitaldaemon.com...
> > Hello everyone.
> >
> > I have a problem regarding D templates.
> >
> > This code doesn't work. I would like to know how do I get it up'n'running?
> >
> > struct temp_t( type ) {
> >    void setOwner( type *newOwner ) {
> >        owner = newOwner;
> >    }
> >
> >    type *getOwner() {
> >        return owner;
> >    }
> >
> >    protected {
> >       temp_t *  head;
> >       temp_t *  next;
> >       temp_t *  prev;
> >       type *      owner;
> >    }
> > }
> >
> > class testClass_t {
> >    this( int d ) {
> >        data = d;
> >        tst.setOwner( &this );
> >    }
> >
> >    int                               data;
> >    temp_t!( testClass_t )    tst;
> > }
> >
> > void foo() {
> >    testClass_t bar = new testClass_t( 0x1234 );
> >
> >    // what is the difference between '==' and 'is'?
> >    assert( ( *bar ).getOwner == bar );  // doesn't work
> > }
> 
> There are a few things going wrong.
> 
> One, when you write "tst.setOwner( &this );", this sets the owner to the 
> address of a local variable.  This is a Bad Thing.  Remember that classes 
> are reference types, so they are implicitly pointers.  So instead of making 
> your struct use pointers, just take all the *s out.
> 
> struct temp_t( type ) {
>     void setOwner( type newOwner ) {
>         owner = newOwner;
>     }
> 
>     type getOwner() {
>         return owner;
>     }
> 
>     protected {
>        temp_t *  head;
>        temp_t *  next;
>        temp_t *  prev;
>        type      owner;
>     }
> }
> 
> Then in your class's constructor, use
> 
> tst.setOwner( this );
> 
> Lastly, this line:
> 
> assert( ( *bar ).getOwner == bar );
> 
> Doesn't even compile because (1) you cannot dereference bar because it's not 
> a pointer, it's a reference, and (2) there is no .getOwner property for the 
> testClass_t class.  Instead, you should use:
> 
> assert( bar.tst.getOwner is bar);
> 
> And that brings me to my last point, the difference between 'is' and '=='. 
> 'is' is used to see if two references (or pointers) point to the same 
> location.  '==' is used to see if two things are equal.  If you have two 
> class references, a and b, and you write
> 
> a == b
> 
> This is the same as writing
> 
> a.opEquals(b)
> 
> If a is null, this will get you a segfault.  However, if you just want to 
> see if a and b are pointing to the same instance, use
> 
> a is b
> 
> Which is what you want to do in your example. 
> 
> 

Thanks for your answer.

Yes, it was my mistake to write it out like this:
>assert( ( *bar ).getOwner == bar );

Well, this is my bug :)
tst.setOwner( &this );

Okay, I've tried to use pointer to class because I intend to use this template for both structures and classes. How do I do that? Do I have to write template specialization?


More information about the Digitalmars-d-learn mailing list