Types A!1 and A!1u not considered equal?
Don
nospam at nospam.com
Fri Oct 21 01:46:42 PDT 2011
On 21.10.2011 02:31, Tobias Brandt wrote:
> 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?
It's a bit similar to bug 1641.
More information about the Digitalmars-d
mailing list