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