Thread overview
Struct toString works but not std.conv.to!string
Oct 13, 2015
Nordlöw
Oct 13, 2015
Jonathan M Davis
Oct 13, 2015
Nordlöw
Oct 13, 2015
Ali Çehreli
Oct 13, 2015
anonymous
October 13, 2015
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
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
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
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
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;`

> }