August 12, 2010
Hi,

I'm new to D. I have the following:

   class A(T) { ... }
   class B(T) : A!(T) { ... }

   class C(T, U : A!(T)) { ... }

And I'm trying to do this

   void main()
   {
       C!(double, B!(double)) var;
   }

but dmd complains:
   Error: template instance C!(double,B) does not match template declaration
C(T,U : A!(T))

If I change the line of main() by

   void main()
   {
       C!(double, A!(double)) var;
   }

it works OK. Does the fact that B(T) is a child of A(T) imply that I can use
B(T) as a template parameter wherever A(T) is expected?

Could you please point to where I'm doing things wrong. I'd really appreciate your feedback.

Thanks,
Ivo


August 12, 2010
Hello Ivo,

> class C(T, U : A!(T)) { ... }
> 
> And I'm trying to do this
> 
> void main()
> {
> C!(double, B!(double)) var;
> }
> but dmd complains:
> Error: template instance C!(double,B) does not match template
> declaration C(T,U : A!(T))

The way you have it is asking for an exact match. I would have to look it up but I think you can make what you want work with something like this:

class C(T, U) if(is(U : A!(T))) { ... }

That takes any types T and U and then checks if  U can convert to A!(T) (I haven't tested that so I might have the syntax wrong.)

-- 
... <IXOYE><