www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why does BinaryHeap sometime cause compile-error in foeach?

reply Shigeki Karita <shigekikarita gmail.com> writes:
https://dpaste.dzfl.pl/cd605899d050

why this code cannot convert to foreach (over Structs and Classes 
with Ranges).

     auto h = new BinaryHeap!(int[])(new int[0]);
     typeof(h).stringof.writeln;
     static assert(isInputRange!(typeof(h)));
     h.insert(3);
     h.insert(1);
     h.insert(2);
     // Error: invalid foreach aggregate `h`
     // foreach (e; h) e.writeln;
     for (; !h.empty; h.popFront()) {
       auto e = h.front();
       e.writeln;
     }


https://dlang.org/spec/statement.html#foreach-with-ranges
Sep 30 2017
parent reply user1234 <user1234 12.lo> writes:
On Saturday, 30 September 2017 at 09:27:23 UTC, Shigeki Karita 
wrote:
 https://dpaste.dzfl.pl/cd605899d050

 why this code cannot convert to foreach (over Structs and 
 Classes with Ranges).

     auto h = new BinaryHeap!(int[])(new int[0]);
     typeof(h).stringof.writeln;
     static assert(isInputRange!(typeof(h)));
     h.insert(3);
     h.insert(1);
     h.insert(2);
     // Error: invalid foreach aggregate `h`
     // foreach (e; h) e.writeln;
     for (; !h.empty; h.popFront()) {
       auto e = h.front();
       e.writeln;
     }


 https://dlang.org/spec/statement.html#foreach-with-ranges
The reason why it doesn't work is much more simple than you think: h is not a BinaryHeap, it's a pointer to. Try "foreach (e; *h) e.writeln;" and it works.
Sep 30 2017
parent Shigeki Karita <shigekikarita gmail.com> writes:
Oh, struct/class semantics really confuses me!
Sep 30 2017