Thread overview
parse int error
Oct 30, 2013
Peter Eisenhower
Oct 30, 2013
Peter Eisenhower
Oct 30, 2013
Jonathan M Davis
Oct 30, 2013
Ali Çehreli
Nov 03, 2013
Peter Eisenhower
October 30, 2013
I am confused as to why I cannot pass the return of the tag attribute directly into the parse int.

// This works
 string s = xml.tag.attr["key"];
 int key = parse!int(s);

// Compile error on these
int key = parse!int(xml.tag.attr["key"]);
int key = parse!int(cast(string) cml.tag.attr["key"]);
October 30, 2013
On Wednesday, 30 October 2013 at 01:02:45 UTC, Peter Eisenhower wrote:
> I am confused as to why I cannot pass the return of the tag attribute directly into the parse int.
>
> // This works
>  string s = xml.tag.attr["key"];
>  int key = parse!int(s);
>
> // Compile error on these
> int key = parse!int(xml.tag.attr["key"]);
> int key = parse!int(cast(string) cml.tag.attr["key"]);

This is the compile error

Error: template instance std.conv.parse!(int,const(immutable(char)[])) error instantiating
October 30, 2013
On Wednesday, October 30, 2013 02:02:40 Peter Eisenhower wrote:
> I am confused as to why I cannot pass the return of the tag attribute directly into the parse int.
> 
> // This works
> string s = xml.tag.attr["key"];
> int key = parse!int(s);
> 
> // Compile error on these
> int key = parse!int(xml.tag.attr["key"]);
> int key = parse!int(cast(string) cml.tag.attr["key"]);

parse takes the string by ref and removes what it's parsing from the string, so it can't be a temporary. It has to be an lvalue. Also, casting results in an rvalue. To use parse, you should generally be using a local variable for the string.

- Jonathan M Davis
October 30, 2013
On 10/29/2013 06:02 PM, Peter Eisenhower wrote:
> I am confused as to why I cannot pass the return of the tag attribute
> directly into the parse int.
>
> // This works
>   string s = xml.tag.attr["key"];
>   int key = parse!int(s);
>
> // Compile error on these
> int key = parse!int(xml.tag.attr["key"]);
> int key = parse!int(cast(string) cml.tag.attr["key"]);

A trivial wrapper makes it convenient:

import std.xml;
import std.conv;

T getAttr(T)(DocumentParser xml, string attrName)
{
    string s = xml.tag.attr[attrName];
    T attr = parse!T(s);
    return attr;
}

unittest
{
    auto xml = new DocumentParser(`<test key="1"></test>`);
    auto key = xml.getAttr!int("key");
    assert(key == 1);
}

void main()
{}

Ali

November 03, 2013
On Wednesday, 30 October 2013 at 18:19:13 UTC, Ali Çehreli wrote:
> On 10/29/2013 06:02 PM, Peter Eisenhower wrote:
>> I am confused as to why I cannot pass the return of the tag attribute
>> directly into the parse int.
>>
>> // This works
>>  string s = xml.tag.attr["key"];
>>  int key = parse!int(s);
>>
>> // Compile error on these
>> int key = parse!int(xml.tag.attr["key"]);
>> int key = parse!int(cast(string) cml.tag.attr["key"]);
>
> A trivial wrapper makes it convenient:
>
> import std.xml;
> import std.conv;
>
> T getAttr(T)(DocumentParser xml, string attrName)
> {
>     string s = xml.tag.attr[attrName];
>     T attr = parse!T(s);
>     return attr;
> }
>
> unittest
> {
>     auto xml = new DocumentParser(`<test key="1"></test>`);
>     auto key = xml.getAttr!int("key");
>     assert(key == 1);
> }
>
> void main()
> {}
>
> Ali

Thanks