On 03/31/2014 10:50 AM, Jeroen Bollen wrote:
I am trying to foreach over a std.container.DList but it isn't working.
I have tried the following code:
https://gist.github.com/Binero/f30e56351baf05f1a2ec

I am getting the following errors:

/usr/include/dlang/dmd/std/container.d(1925): Error: template
std.container.DList!ubyte.DList.insertBeforeNode cannot deduce function
from argument types !()(typeof(null), int), candidates are:
/usr/include/dlang/dmd/std/container.d(2096):
std.container.DList!ubyte.DList.insertBeforeNode(Stuff)(Node* n, Stuff
stuff) if (isInputRange!Stuff &&
isImplicitlyConvertible!(ElementType!Stuff, T))
/usr/include/dlang/dmd/std/container.d(2155):
std.container.DList!ubyte.DList.insertBeforeNode(Stuff)(Node* n, Stuff
stuff) if (isImplicitlyConvertible!(Stuff, T))
source/app.d(7): Error: template instance
std.container.DList!ubyte.DList.insertBack!int error instantiating
source/app.d(11): Error: invalid foreach aggregate list1

Some notes:

1) DList is a struct. So, there is no need for 'new'. However, new is not an error but then the ~= syntax below cannot work on list1 without dereferencing. (You did not use ~=, I just liked it. :) )

    (*list1) ~= cast(ubyte)3;    // would work

2) For the same reason, list1[] becomes plain array slicing and the compiler is looking for "upper and lower bound to slice pointer". This would work:

    (*list1)[]

3) 1, 2, and 3 are ints. So, I had to cast them.

import std.container;
import std.stdio;

void main()
{
    auto list1 = DList!ubyte();

    list1.insertBack(cast(ubyte)1);
    list1.insertBack(cast(ubyte)2);
    list1 ~= cast(ubyte)3;    // alternative syntax

    foreach(ubyte item; list1[]) {
        writeln(item);
    }
}

Ali

Reply via email to