Thread overview
opDispatch returning this not working in a hierarchy
Feb 02, 2012
Daniel L. Alves
Feb 02, 2012
Walter Bright
Feb 02, 2012
Daniel Murphy
February 02, 2012
Hi,
I don't know if this is really a bug or some gotcha of the language that I
don't get. I'm sorry if it happens to be the later.

When I run this simple program

class DispatchBase
{
    auto opDispatch( string m, Args... )( Args  args )
    {
        writefln( "Tried to call %s", m );
        return this;
    }
}

class DispatchDerived : DispatchBase
{
    void printValue( T )( T value )
    {
        writefln( "Value is %s", value );
    }
}

void main()
{
    DispatchBase base = new DispatchDerived();
    base.items.printValue( true );
}

I receive this output

Tried to call items
Tried to call printValue

But what I was expecting is

Tried to call items
Value is true

After all, opDispatch returns 'this'. The interesting thing is that when I move opDispatch up to DispatchDerived, everything works fine. It's like 'this' inside opDispatch didn't recognize its real type when in a base class.

Hope you can help me.
Daniel
February 02, 2012
On 2/1/2012 8:00 PM, Daniel L. Alves wrote:
> I don't know if this is really a bug or some gotcha of the language that I
> don't get. I'm sorry if it happens to be the later.


This n.g. is mainly for bugzilla notifications. Questions like this should go into the digitalmars.D.learn n.g.

But to answer your question, printValue is a template, and templates are not virtual. Also, DispatchBase.opDispatch knows nothing about DispatchDerived.
February 02, 2012
There are some issues with mixing opDispatch and property syntax.  Try:
base.items().printValue( true );

This list is not for posting bug reports, it's just for bugzilla issues. Please post this kind of thing to d.learn or open a bug report at http://d.puremagic.com/issues/

"Daniel L. Alves" <daniel_lopes_alves@hotmail.com> wrote in message news:jgd1oj$2r04$1@digitalmars.com...
> Hi,
> I don't know if this is really a bug or some gotcha of the language that I
> don't get. I'm sorry if it happens to be the later.
>
> When I run this simple program
>
> class DispatchBase
> {
>    auto opDispatch( string m, Args... )( Args  args )
>    {
>        writefln( "Tried to call %s", m );
>        return this;
>    }
> }
>
> class DispatchDerived : DispatchBase
> {
>    void printValue( T )( T value )
>    {
>        writefln( "Value is %s", value );
>    }
> }
>
> void main()
> {
>    DispatchBase base = new DispatchDerived();
>    base.items.printValue( true );
> }
>
> I receive this output
>
> Tried to call items
> Tried to call printValue
>
> But what I was expecting is
>
> Tried to call items
> Value is true
>
> After all, opDispatch returns 'this'. The interesting thing is that when I
> move opDispatch up to DispatchDerived, everything works fine. It's like
> 'this'
> inside opDispatch didn't recognize its real type when in a base class.
>
> Hope you can help me.
> Daniel