| 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
Permalink
Reply