chain(const(array of class)) fails

SimonN via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jan 31 13:22:06 PST 2016


Hi,

we start with the following code snippet, which works.

     import std.algorithm;
     import std.range;
     import std.stdio;

     class A     { int val; }
     class B : A { this() { val = 3; } }
     class C : A { this() { val = 4; } }

     B[] b = [new B(), new B()];
     C[] c = [new C(), new C()];

     void main()
     {
         chain(b, c).each!(a => a.val.writeln);
     }

The output, as expected, is:

     3
     3
     4
     4

Now I change the declarations of B[] b and C[] c to the 
following, keeping
everything else in the code snippet the same:

     const(B[]) b = [new B(), new B()];
     const(C[]) c = [new C(), new C()];

This makes dmd 2.070 choke: ( http://dpaste.dzfl.pl/eee69fd03dd9 )

     Error: template std.range.chain cannot deduce function from 
argument
     types !()(const(B[]), const(C[])),
     candidates are: 
/opt/compilers/dmd2/include/std/range/package.d(804):
     std.range.chain(Ranges...)(Ranges rs) if (Ranges.length > 0 &&
     allSatisfy!(iseputRange, staticMap!(Unqual, Ranges)) && 
!is(CommonType!(
     staticMap!(ElementType, staticMap!(Unqual, Ranges))) == void))

What's stumping me -- constness doesn't make dmd choke on ranges 
of
numbers. If I replace the classes B and C with simple 'int' and 
'double',
this compiles again:

     const(int[])    b = [1, 2];
     const(double[]) c = [3.3, 4.4];
     void main() { chain(b, c).each!(a => a.writeln); }

Why does it fail for const(array of class)?
Is any template magic about Unqual or staticMap relevant here?

-- Simon


More information about the Digitalmars-d-learn mailing list