Struct template cannot deduce function from argument types
lithium iodate
whatdoiknow at doesntexist.net
Wed Jun 27 17:08:19 UTC 2018
On Wednesday, 27 June 2018 at 16:19:56 UTC, Luka Aleksic wrote:
> […]
> I am getting the following error:
>
> scratch.d(14): Error: struct scratch.pair cannot deduce
> function from argument types !()(char, int), candidates are:
> scratch.d(2): scratch.pair(T, U)
> Failed: ["/usr/bin/dmd", "-v", "-o-", "scratch.d", "-I."]
>
> Changing the offending line to:
>
> pair!(char, uint) p1 = pair!(char, uint)('a', 1);
>
> fixes the issue.
>
> However I am interested to know why the first code couldn't
> deduce the types-- and why does it even have to try to deduce
> them, when I explicitly stated that p1 was of the type "pair of
> char and uint"?
>
> Thanks,
> L. Aleksic
Type inference does not work for struct construction. There are
some technical problems with allowing that, such as this() having
the capability of being a separate template itself.
Relevant issue tracker entry:
https://issues.dlang.org/show_bug.cgi?id=6082
Your construction call does not work because the right hand side
determines its type using only information present on the right
hand side, in that sense you're not explicitly providing types at
all.
In order to still be able to make concise construction calls, you
can define a factory function:
struct Pair(A, B)
{
A a;
B b;
this(A a, B b)
{
this.a = a;
this.b = b;
}
}
Pair!(A, B) pair(A, B)(A a, B b)
{
return Pair!(A, B)(a, b);
}
void main()
{
auto p = pair(1, "test");
pragma(msg, typeof(p)); //Pair!(int, string)
}
More information about the Digitalmars-d-learn
mailing list