Sorry for late reply -- but I got around to test a couple more cases!

On Monday, 1 February 2016 at 00:19:44 UTC, Nicholas Wilson wrote:
Unqaul means remove any const or immutable torn the type

Okay, that sounds like our 'const' shouldn't matter. 'const' is the outermost qualifier, and stripping that leaves us with B[] and C[], which were chainable earlier.

StaticMap is like a compile time map
What this error message says is that there is one candidate function that matches what you are attempting to do. and that chain takes a variadic argument and each of those arguments must 1) when unqualified be an input range (Basically you can foreach over it)

Yep, const(B[]) and const(C[]) can be foreached. My workaround has been to replace chain() with several foreaches.

2) that the common type of the element type of the unqualified variadic argument types is not void (in this case not arrays of void) Have you tried changing The declaration of a and b to const(A[])?

Surprisingly, this compiles and gives the desired output:

    const(B[]) b = [ new B(), new B() ];
    const(A[]) c = [ new C(), new C() ]; // A instead of C

    chain(b, c).each!(a => a.val.writeln);

With two arguments, const(array) has worked iff at least one range is of the base type. Only if none were of the base type, I got the error.

Apparently, the template is smart enough to infer the common base type without 'const', but needs to be fed the basetype in case of 'const'.

My gut feeling is that I should report this as a bug against phobos...

Also have you tried with other reference type (e.g. assoc arrays pointers)?

    immutable(B[int]) b;
    immutable(C[int]) c;

    chain(b.byValue, c.byValue).each!(a => a.val.writeln);

Error is the same as for the classes:

    template std.range.chain cannot deduce function
from argument types !()(Result, Result), candidates are: /* snip */

To get this error, again, if at least one range is 'immutable(A[int]).byValue', i.e., using the base class A, the template instantiates with no problems.

-- Simon

Reply via email to