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

Reply via email to