On Wednesday, 3 May 2017 at 07:34:03 UTC, Daniel Kozák wrote:
V Wed, 03 May 2017 06:54:15 +0000
nkm1 via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
napsáno:

Consider:

import std.stdio;

class A
{
     final print() { writeln(this); } // no return type
}

class B : A
{
     final void print() { writeln(this); }
}

void main()
{
     auto b = new B;
     b.print();

     A a1 = b;
     a1.print();

     A a2 = new A;
     a2.print();
}

That compiles:

$ dmd -de -w -g ./main.d
$ main
main.B
main.B
main.A

with dmd 2.074 on linux:

$ dmd --version
DMD64 D Compiler v2.074.0
Copyright (c) 1999-2017 by Digital Mars written by Walter Bright

Is that a bug? (in the compiler). I'm learning D, and I'm half way through Andrei's book; I also read the documentation (on D's website) and I think that shouldn't compile?

print in A is template:

import std.stdio;

class A
{
    template print() {
        void print()
        {
            writeln("A version");
        } // no return type
    }
}

How is it a template in the original example?

final print() { writeln(this); } // no return type

does not have the extra set of parens required to turn it into a template. It _does_ use inference, just like

static a = 42;

uses inference and

final auto print() { writeln(this); }

uses inference, but it shouldn't be a template any more than

static a = 42;

is a template.

- Jonathan M Davis

Reply via email to