On Wed, Jun 27, 2018 at 04:19:56PM +0000, Luka Aleksic via Digitalmars-d-learn wrote: [...] > struct pair(T, U) { > T first; > U second; > > this(T arg_first, U arg_second) { > first = arg_first; > second = arg_second; > } > }; > > void main() { > > pair!(char, uint) p1 = pair('a', 1);
The usual way I'd write this is: auto p1 = pair!(char, uint)('a', 1); This saves having to retype a complicated type, and also gives the compiler the template arguments in the place where it needs them. [...] > 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."] The reason is that the compiler runs semantic on the right-hand side of the assignment first, before it looks at the type of p1. The expression `pair('a', 1)` is ambiguous, since the compiler doesn't (yet) know which instantiation of `pair` you intended. Writing it the way I recommend above avoids this problem. T -- Answer: Because it breaks the logical sequence of discussion. Question: Why is top posting bad?