Types A!1 and A!1u not considered equal?

Tobias Brandt tob.brandt at googlemail.com
Thu Oct 20 17:31:42 PDT 2011


Consider the following program:

 class A(uint N) {}
 void foo(uint N)(A!N) {}

 void main()
 {
     auto a = new A!1;                           // compiles
     foo(new A!1);                               // error
     foo(new A!1u);                              // compiles
     foo(cast(A!1u) A!1)                         // compiles, but may
                                                //   crash at runtime
     assert(typeid(new A!1) == typeid(new A!1u)) // compiles, fails at runtime
 }

The second line in main gives the following error:

Error: cannot implicitly convert expression (new A) of type
       test.A!(1).A to test.A!(N).A

Adding the 'u' makes the code compile without errors. Explicitly
instantiating foo with !1 or !1u does not change anything.

>From the first line, it is clear that instantiating A!1 is not the
problem. Apparently A!1 and A!1u are considered distinct types,
although the template parameter must in both cases be of type uint
and have value 1 and thus be identical.

What's going on here?


More information about the Digitalmars-d mailing list