DMD 1.031 and 2.015 templates
Steven Schveighoffer
schveiguy at yahoo.com
Thu Jun 19 06:41:48 PDT 2008
"Lars Ivar Igesund" wrote
> Walter Bright wrote:
>
>> Lars Ivar Igesund wrote:
>>> Walter Bright wrote:
>>>
>>>> Some new stuff to make writing templates easier.
>>>>
>>>> http://www.digitalmars.com/d/1.0/changelog.html
>>>> http://ftp.digitalmars.com/dmd.1.030.zip
>>>
>>> (Wrong zip link ^)
>>>
>>> Something broke, probably due to the fix in 617 and/or 1383:
>>>
>>> Given
>>>
>>> T[] layout(T) (T[] output, T[][] layout ...)
>>>
>>> the following code
>>>
>>> T[] format(T) (T[] output, Time t) {
>>>
>>> T[] convert (T[] tmp, long i)
>>> {
>>> return Integer.formatter!(T) (tmp, i, 'u', 0, 8);
>>> }
>>>
>>> return layout (output, "%0, %1 %2 %3 %4:%5:%6 GMT",
>>> Days[date.dow],
>>> convert (tmp[0..2], date.day),
>>> Months[date.month-1],
>>> convert (tmp[2..6], date.year),
>>> convert (tmp[6..8], time.hours),
>>> convert (tmp[8..10], time.minutes),
>>> convert (tmp[10..12], time.seconds)
>>> );
>>> }
>>>
>>> results in
>>>
>>> :template layout(T) does not match any template declaration
>>> :template layout(T) cannot deduce template function from argument types
>>>
> (wchar[],char[25u],wchar[],wchar[],wchar[],wchar[],wchar[],wchar[],wchar[])
>>
>> Can you make a standalone test case, please?
>
> The standalone test case works fine if I append 'w' to the literal, so
> seems
> like that is a no :) However, prepending it with cast(T[]) seems to be an
> acceptable workaround though.
>
So basically, the issue is that D is not inferring the type of the string
literal based on the context. In the D spec, it implies that the type can
be inferred (http://www.digitalmars.com/d/1.0/lex.html):
"The optional Postfix character gives a specific type to the string, rather
than it being inferred from the context. This is useful when the type cannot
be unambiguously inferred, such as when overloading based on string type"
I'm guessing that this implies that normally, it CAN be inferred from the
context, although this is not specifically stated (should it be?). It seems
unambiguous in the example that the type of T should be whatever type
'output' is. Therefore, IFTI should interpret T as being wchar, which
should imply that the literal should be a wchar[].
-Steve
More information about the Digitalmars-d-announce
mailing list