Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
October 13, 2015 Struct toString works but not std.conv.to!string | ||||
---|---|---|---|---|
| ||||
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. |
October 13, 2015 Re: Struct toString works but not std.conv.to!string | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | 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
|
October 13, 2015 Re: Struct toString works but not std.conv.to!string | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | 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
|
October 13, 2015 Re: Struct toString works but not std.conv.to!string | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | 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 Davis
None 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.
|
October 13, 2015 Re: Struct toString works but not std.conv.to!string | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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 compile This 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;` > } |
Copyright © 1999-2021 by the D Language Foundation