digitalmars.D.learn - ElementType!(Range) problem
- Ishan Thilina (18/18) Apr 05 2011 I can use the ElementType() template in the std.rane library to find the...
- Philippe Sigaud (16/31) Apr 05 2011 ElementType acts on types. It takes a type and 'returns' (compiles to,
- Ishan Thilina (11/21) Apr 06 2011 Got it!. Thanks.
I can use the ElementType() template in the std.rane library to find the type of the elements of a range,isn't it? But I cant compile the following programme. I get a "untitled.d(32): Error: template instance ElementType!(listR) does not match template declaration ElementType(R)" error. What could be the problem ? -------------------------------------------------------------------------- import std.stdio; import std.range; import std.container; int main(char[][] args) { auto list=SList!(int)(1,2,3); auto listR=list.opSlice(); writefln("%s",ElementType!(listR)); return 0; } -------------------------------------------------------------- Thank you...!
Apr 05 2011
I get a "untitled.d(32): Error: template instance ElementType!(listR) doe=s notmatch template declaration ElementType(R)" error. What could be the problem ? -------------------------------------------------------------------------=-import std.stdio; import std.range; import std.container; int main(char[][] args) { =C2=A0 =C2=A0 =C2=A0 =C2=A0auto list=3DSList!(int)(1,2,3); =C2=A0 =C2=A0 =C2=A0 =C2=A0auto listR=3Dlist.opSlice(); =C2=A0 =C2=A0 =C2=A0 =C2=A0writefln("%s",ElementType!(listR)); =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0; } --------------------------------------------------------------ElementType acts on types. It takes a type and 'returns' (compiles to, actually) another type. You need to give it typeof(listR). Then, as ElementType!(typeof(listR)) is a type, you cannot pass it to writeln. Use .stringof to go from the type to a string representation of its name. So: writefln("%s", ElementType!(typeof(listR)).stringof); ElementType!(typeof(listR)) is a type like any other. You can create a variable with it: ElementType!(typeof(listR)) elem; Btw, .opSlice() is the name of the '[]' operator. You previous line can be written like this: auto listR =3D list[]; Philippe
Apr 05 2011
--Philippe wrote::ElementType acts on types. It takes a type and 'returns' (compiles to, actually) another type. You need to give it typeof(listR). Then, as ElementType!(typeof(listR)) is a type, you cannot pass it to writeln. Use .stringof to go from the type to a string representation of its name. So: writefln("%s", ElementType!(typeof(listR)).stringof); ElementType!(typeof(listR)) is a type like any other. You can create a variable with it: ElementType!(typeof(listR)) elem;Got it!. Thanks. I faced this confusion because of the description for "ElementType" which is available in http://d-programming-language.org/phobos/std_range.html. It says, " template ElementType(R): The element type of R. R does not have to be a range. The element type is determined as the type yielded by r.front for an object r or type R. For example, ElementType!(T[]) is T. If R is not a range, ElementType!R is void. " So I thought that just passing ElementType!listR was adequate. :s
Apr 06 2011