class template specialization and inheritance

mki none at none.com
Sat May 24 03:53:25 PDT 2008


Since I got no further answer, I decided to do so and filed a bug report:
http://d.puremagic.com/issues/show_bug.cgi?id=2126

~mki

Fawzi Mohamed Wrote:

> On 2008-05-14 00:55:41 +0200, mki <none at none.com> said:
> 
> > Hello!
> > 
> > I just discovered the template syntax of D. I am very exited about its 
> > simplicity compared to C++.
> > 
> > Now I ran into a template behavior I do not understand. This code:
> > 
> > *** begin code 1 ***
> > import std.stdio;
> > 
> > class A { }
> > 
> > class B : A { }
> > 
> > class C(T:A) {
> >     static void tellMe() {
> >         writefln("derived from A.");
> >     }
> > }
> > 
> > class C(T) {
> >     static void tellMe() {
> >         writefln("generic.");
> >     }
> > }
> > 
> > void main() {
> >     C!(A).tellMe();
> >     C!(B).tellMe();
> >     C!(int).tellMe();
> > }
> > *** end code 1 ***
> > 
> > as expected produces the output:
> > 
> > derived from A.
> > derived from A.
> > generic.
> > 
> > 
> > But this code
> > *** begin code 2 ***
> > import std.stdio;
> > 
> > class A(T) { }
> > 
> > class B(T) : A!(T) { }
> > 
> > class C(TT:A!(T)) {
> >     static void tellMe() {
> >         writefln("derived from A!(T).");
> >     }
> > }
> > 
> > class C(T) {
> >     static void tellMe() {
> >         writefln("generic.");
> >     }
> > }
> > 
> > void main() {
> >     C!(A!(int)).tellMe();
> >     C!(B!(int)).tellMe();
> >     C!(int).tellMe();
> > }
> > *** end code 2 ***
> > 
> > gives the output:
> > derived from A!(T).
> > generic.
> > generic.
> > 
> > 
> > In the second line I would expect the output "derived from A!(T)", like 
> > in the example of code 1. My feeling is that for C!(B!(int))
> > 'class C(TT:A!(T))'
> > with TT=B!(T) and T=int should be a better specialization than
> > 'class C(T)'
> > with T=B!(T).
> > 
> > Why is 'class C(T)' chosen here?
> 
> It looks like a bug to me, I would write a report on
> 	http://d.puremagic.com/issues/
> 
> maybe you should rewrite the messages to "T is derived from ...", 
> because C is not derived from those classes, and the message is 
> misleading.
> 
> Fawzi



More information about the Digitalmars-d mailing list