Thread overview
Template alias as template specialisation not recognized.
Jan 16, 2021
Paul
Jan 16, 2021
Paul Backus
Jan 16, 2021
Paul
Jan 16, 2021
Basile B.
January 16, 2021
I'm having issues when trying to use a template alias as a template specialisation.
When using the following:
> alias Vec(uint size, Type) = Mat!(size, 1, Type);

> void setUniform(V : Vec!(L, bool), int L)(string name, V value) {...}

> Vec!(4, bool) a;
> setUniform("test", a);

I get the following error:
> template `shader.Shader.setUniform` cannot deduce function from argument types `!()(string, Mat!(4u, 1u, bool))`, candidates are:DUB
shader.d(43, 7): `setUniform(V : Vec!(L, bool), uint L)(string name, V value)`

Meanwhile, when using the following, I have no issues:
> void setUniform(V : Mat!(L, 1, bool), int L)(string name, V value) {}
January 16, 2021
On Saturday, 16 January 2021 at 01:21:24 UTC, Paul wrote:
> I'm having issues when trying to use a template alias as a template specialisation.
> When using the following:
>> alias Vec(uint size, Type) = Mat!(size, 1, Type);
>
>> void setUniform(V : Vec!(L, bool), int L)(string name, V value) {...}
>
>> Vec!(4, bool) a;
>> setUniform("test", a);
>
> I get the following error:
>> template `shader.Shader.setUniform` cannot deduce function from argument types `!()(string, Mat!(4u, 1u, bool))`, candidates are:DUB
> shader.d(43, 7): `setUniform(V : Vec!(L, bool), uint L)(string name, V value)`
>
> Meanwhile, when using the following, I have no issues:
>> void setUniform(V : Mat!(L, 1, bool), int L)(string name, V value) {}

You have encountered issue 1807:

https://issues.dlang.org/show_bug.cgi?id=1807

The easiest way to work around it that I know of is to change `Vec` from an alias into a struct:

struct Vec(uint size_, Type)
{
    Mat!(size, 1, Type) payload;
    alias payload this;
}
January 16, 2021
On Saturday, 16 January 2021 at 01:38:38 UTC, Paul Backus wrote:
> You have encountered issue 1807:
>
> https://issues.dlang.org/show_bug.cgi?id=1807

Ah I see, thank you, sad to see several DIP's I'd be interested in are postponed :(
Thanks for the workaround hint, I'll probably be using that.
January 16, 2021
On Saturday, 16 January 2021 at 01:21:24 UTC, Paul wrote:
> I'm having issues when trying to use a template alias as a template specialisation.
> When using the following:
>> alias Vec(uint size, Type) = Mat!(size, 1, Type);
>
>> void setUniform(V : Vec!(L, bool), int L)(string name, V value) {...}
>
>> Vec!(4, bool) a;
>> setUniform("test", a);
>
> I get the following error:
>> template `shader.Shader.setUniform` cannot deduce function from argument types `!()(string, Mat!(4u, 1u, bool))`, candidates are:DUB
> shader.d(43, 7): `setUniform(V : Vec!(L, bool), uint L)(string name, V value)`
>
> Meanwhile, when using the following, I have no issues:
>> void setUniform(V : Mat!(L, 1, bool), int L)(string name, V value) {}

In this case you can use a const template parameter:

  alias Vec(uint size, Type, const uint length = 1) = Mat!(size, length, Type);

Although this is not a generic workaround for the issue mentioned.