On Tuesday, 17 August 2021 at 09:59:53 UTC, Rekel wrote:
When using implicit function templates, identical specialization yield different results.
Example:

```d
template TFoo(T)        { void foo(){writeln("1");} } // #1
template TFoo(T : T[])  { void foo(){writeln("2");} } // #2

void foo(T)(){
        writeln("1");
}

void foo(T : T[])(){
        writeln("1");
}

void main(string[] args) { // Works
        TFoo!(int).foo();            // "1"
        TFoo!(double[]).foo();       // "2"
        foo!(int)();            // "1"
        foo!(double[])();       // "1" !
}
```

I'm fairly certain the last call _should_ yield "2", yet it does not.

The error is in your code. Both of your `foo` templates are implemented to print `"1"`. Change the second one to print "2" and you will see the desired output.

At any rate, to specialize on arrays you should generally be using something like `T : U[], U`. Ditto for pointers: `T : U*, U`.

Reply via email to