Thread overview | |||||
---|---|---|---|---|---|
|
May 15, 2020 Weird template error message | ||||
---|---|---|---|---|
| ||||
Stripped down example... module test; import std.traits; auto offsetBy(T,F)(T path, F x, F y) { alias PathFloat = TemplateArgsOf!T[0]; struct Offseter(Q) { Q path; PathFloat x; PathFloat y; } return Offseter(path, cast(PathFloat) x, cast(PathFloat) y); } void Foo() { struct Path(T) { T a; } Path!float p; offsetBy(p, 1, 1); } ----> <source>(18): Error: struct `test.offsetBy!(Path!float, int).offsetBy.Offseter` cannot deduce function from argument types `!()(Path!float, float, float)`, candidates are: <source>(11): `test.offsetBy!(Path!float, int).offsetBy.Offseter(Q)` <source>(25): Error: template instance `test.offsetBy!(Path!float, int)` error instantiating Compiler returned: 1 (ldc 1.17) If you look at the template parameters in the error message you'll see "offsetBy!(Path!float, int)" which is clearly wrong... is it a compiler bug, or just a crappy error message? |
May 15, 2020 Re: Weird template error message | ||||
---|---|---|---|---|
| ||||
Posted in reply to NaN | On Friday, 15 May 2020 at 21:40:20 UTC, NaN wrote:
> Stripped down example...
>
> module test;
>
> import std.traits;
>
> auto offsetBy(T,F)(T path, F x, F y)
> {
> alias PathFloat = TemplateArgsOf!T[0];
>
> struct Offseter(Q)
> {
> Q path;
> PathFloat x;
> PathFloat y;
> }
>
> return Offseter(path, cast(PathFloat) x, cast(PathFloat) y);
This line is the problem. Template argument deduction does not work for constructors; you have to write `Offsetter!T(...)`.
|
May 15, 2020 Re: Weird template error message | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Backus | On Friday, 15 May 2020 at 21:55:16 UTC, Paul Backus wrote:
> On Friday, 15 May 2020 at 21:40:20 UTC, NaN wrote:
>> Stripped down example...
>>
>> module test;
>>
>> import std.traits;
>>
>> auto offsetBy(T,F)(T path, F x, F y)
>> {
>> alias PathFloat = TemplateArgsOf!T[0];
>>
>> struct Offseter(Q)
>> {
>> Q path;
>> PathFloat x;
>> PathFloat y;
>> }
>>
>> return Offseter(path, cast(PathFloat) x, cast(PathFloat) y);
>
> This line is the problem. Template argument deduction does not work for constructors; you have to write `Offsetter!T(...)`.
Ah OK thanks. Not the most helpful error message from the compiler lol.
|
Copyright © 1999-2021 by the D Language Foundation