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