Template type deduction question
Basile B.
b2.temp at gmx.com
Thu May 21 07:16:11 UTC 2020
On Thursday, 21 May 2020 at 04:46:02 UTC, data pulverizer wrote:
> I'd like to pass kernel functions using:
>
> ```
> auto calculateKernelMatrix(K, T)(K!(T) Kernel, Matrix!(T) data)
> {
> ...
> }
>
> ```
>
> and call it using `calculateKernelMatrix(myKernel, myData);`
> but I get a type deduction error and have to call it using
> `calculateKernelMatrix!(typeof(myKernel), float)(myKernel,
> myData);`
>
> How do I resolve this?
The problem is that "K" is a template type parameter [1].
When the compiler deduces the parameter that ends up with a
symbol, i.e not a type.
To permit a symbol to be deduced you can use a template alias
parameter[2] instead:
---
struct Matrix(T) {}
struct Kernel(T) {}
void calculateKernelMatrix(alias K, T)(K!T kernel, Matrix!T data)
{ }
void main()
{
Matrix!float m;
Kernel!float k;
calculateKernelMatrix(k,m); // OK
}
---
However I think that there could be an useful error message, as
the current one is of no usefulness. Note that maybe that under
the hood there's one but the compiler uses a system of gagging
when trying uncertain operations, so that other things can be
tried, in case of failure.
[1] https://dlang.org/spec/template.html#template_type_parameters
[2] https://dlang.org/spec/template.html#aliasparameters
More information about the Digitalmars-d-learn
mailing list