digitalmars.D.learn - Struct toString works but not std.conv.to!string
- =?UTF-8?B?Tm9yZGzDtnc=?= (13/13) Oct 13 2015 I have defined a struct UTCOffset in
- Jonathan M Davis via Digitalmars-d-learn (11/24) Oct 13 2015 Just glancing at your code, you've marked toString with @property, which...
- =?UTF-8?B?Tm9yZGzDtnc=?= (9/21) Oct 13 2015 None of you advice helped.
- =?UTF-8?Q?Ali_=c3=87ehreli?= (18/30) Oct 13 2015 Reduced with a workaround:
- anonymous (8/21) Oct 13 2015 This ends up being ignored, because UTCOffset has a member called
I have defined a struct UTCOffset in https://github.com/nordlow/justd/blob/master/datetime_ex.d Everything works as desired except for import std.conv : to; assert(UTCOffset(+14, 0).to!string == "UTC+14:00"); which fails as /usr/include/dmd/phobos/std/conv.d(293,14): Error: template instance isRawStaticArray!() does not match template declaration isRawStaticArray(T, A...) datetime_ex.d(129,29): Error: cannot resolve type for UTCOffset(cast(ubyte)0u).this(cast(byte)14, cast(ubyte)0u).to!string I don't understand what's wrong.
Oct 13 2015
On Tuesday, October 13, 2015 21:07:07 Nordlöw via Digitalmars-d-learn wrote:I have defined a struct UTCOffset in https://github.com/nordlow/justd/blob/master/datetime_ex.d Everything works as desired except for import std.conv : to; assert(UTCOffset(+14, 0).to!string == "UTC+14:00"); which fails as /usr/include/dmd/phobos/std/conv.d(293,14): Error: template instance isRawStaticArray!() does not match template declaration isRawStaticArray(T, A...) datetime_ex.d(129,29): Error: cannot resolve type for UTCOffset(cast(ubyte)0u).this(cast(byte)14, cast(ubyte)0u).to!string I don't understand what's wrong.Just glancing at your code, you've marked toString with property, which is kind of a weird thing to do, nd if we ever make property enforce that it's not called with parens, then that code won't work. So, you might try moving that property: to after toString and see if that fixes your problem. But given the error, my guess is that the problem relates to the fact that you templatized the constructor, which is often problematic, and whatever type introspection std.conv.to is doing could be choking on that. So, you should probably try making it so that the constructor isn't templatized and see if that fixes the problem. - Jonathan M Davis
Oct 13 2015
On Tuesday, 13 October 2015 at 21:50:54 UTC, Jonathan M Davis wrote:Just glancing at your code, you've marked toString with property, which is kind of a weird thing to do, nd if we ever make property enforce that it's not called with parens, then that code won't work. So, you might try moving that property: to after toString and see if that fixes your problem. But given the error, my guess is that the problem relates to the fact that you templatized the constructor, which is often problematic, and whatever type introspection std.conv.to is doing could be choking on that. So, you should probably try making it so that the constructor isn't templatized and see if that fixes the problem. - Jonathan M DavisNone of you advice helped. Fortunately I found a solution: If I move import std.conv : to; into the function scopes the problem goes away. Thanks, anyway, for you time.
Oct 13 2015
On 10/13/2015 02:07 PM, Nordlöw wrote:I have defined a struct UTCOffset in https://github.com/nordlow/justd/blob/master/datetime_ex.d Everything works as desired except for import std.conv : to; assert(UTCOffset(+14, 0).to!string == "UTC+14:00"); which fails as /usr/include/dmd/phobos/std/conv.d(293,14): Error: template instance isRawStaticArray!() does not match template declaration isRawStaticArray(T, A...) datetime_ex.d(129,29): Error: cannot resolve type for UTCOffset(cast(ubyte)0u).this(cast(byte)14, cast(ubyte)0u).to!string I don't understand what's wrong.Reduced with a workaround: struct UTCOffset { import std.conv : to; // Move to module scope to compile string toString() const { return "hello"; } } void main() { import std.conv : to; UTCOffset().to!string; } This is an issue that I know to be known. :) I think it is about private definitions (isRawStaticArray) of modules not working outside? or when in inner scopes? Something like that... Ali
Oct 13 2015
On Tuesday, 13 October 2015 at 22:21:43 UTC, Ali Çehreli wrote:Reduced with a workaround: struct UTCOffset { import std.conv : to; // Move to module scope to compileThis introduces UTCOffset.to as an alias to std.conv.to.string toString() const { return "hello"; } } void main() { import std.conv : to;This ends up being ignored, because UTCOffset has a member called `to`.UTCOffset().to!string;This does not do call std.conv.to through UFCS. Instead, it calls UTCOffset's static alias of std.conv.to without an argument. That is: `UTCOffset().to!string;` = `UTCOffset.to!string;` = `std.conv.to!string;`}
Oct 13 2015