tdpl: partial ordering of functions: conflict error

Timon Gehr timon.gehr at gmx.ch
Wed Jan 18 09:05:17 PST 2012


On 01/18/2012 05:40 PM, Jerome BENOIT wrote:
>
>
> On 18/01/12 17:07, Timon Gehr wrote:
>> On 01/18/2012 04:57 PM, Timon Gehr wrote:
>>> On 01/18/2012 02:32 PM, Jerome BENOIT wrote:
>>>>
>>>>
>>>> On 18/01/12 04:36, Jonathan M Davis wrote:
>>>>> On Wednesday, January 18, 2012 02:33:25 Jerome BENOIT wrote:
>>>>>> And I cannot figure why :-(
>>>>>
>>>>> http://d.puremagic.com/issues/show_bug.cgi?id=1528
>>>>>
>>>>> As a workaround, templatize the last function by changing its
>>>>> signature to
>>>>>
>>>>> int[] find()(int[] longer, int[] shorter)
>>>>
>>>> actually it does not work either: gdmd gives an other error message
>>>> now.
>>>>
>>>> ------------------------------------------------------------------------
>>>>
>>>> T[] find(T, E)(T[] haystack, E needle)
>>>> if (is(typeof(haystack[0] != needle) == bool)) {
>>>> while (haystack.length > 0 && haystack[0] != needle) {
>>>> haystack = haystack[1 .. $];
>>>> }
>>>> return haystack;
>>>> }
>>>>
>>>> TL[] find(TL, TS)(TL[] longer, TS[] shorter)
>>>> if (is(typeof(longer[0 .. 1] == shorter) : bool)) {
>>>> while (longer.length >= shorter.length) {
>>>> if (longer[0 .. shorter.length] == shorter) break;
>>>> longer=longer[1 .. $];
>>>> }
>>>> return longer;
>>>> }
>>>>
>>>> int[] find()(int[] longer, int[] shorter) {
>>>> while (longer.length >= shorter.length) {
>>>> if (longer[0 .. shorter.length] == shorter) break;
>>>> longer=longer[1 .. $];
>>>> }
>>>> return longer;
>>>> }
>>>>
>>>> unittest {
>>>> // Test the introduced overloads
>>>> long[] a1 = [ 6, 1, 2, 3 ];
>>>> long[] a2 = [ 1 , 2 ];
>>>> int[] b1 = [ 6, 1, 2, 3 ];
>>>> int[] b2 = [ 1 , 2 ];
>>>> assert(find(a1, a2) == a1[1 .. $]);
>>>> assert(find(a1, b2) == a1[1 .. $]);
>>>> assert(find(b1, b2) == b1[1 .. $]);
>>>> }
>>>>
>>>> void main() {}
>>>> ------------------------------------------------------------------------
>>>>
>>>>
>>>> The message is now:
>>>> searching_05.d:34: Error: template searching_05.find(T,E) if
>>>> (is(typeof(haystack[0] != needle) == bool)) find(T,E) if
>>>> (is(typeof(haystack[0] != needle) == bool)) matches more than one
>>>> template declaration, searching_05.d(9):find(TL,TS) if
>>>> (is(typeof(longer[0..1] == shorter) : bool)) and
>>>> searching_05.d(18):find()
>>>>
>>>> Is partial ordering really supported ?
>>>>
>>>
>>> Yes it is, and your code snippet indeed compiles on my machine. Are you
>>> maybe using an outdated version of the compiler?
>>>
>>>
>>
>> Nevermind, I forgot to pass the -unittest switch. It indeed gives that
>> error. The reason it still does not compile is that the workaround
>> proposed by Jonathan has slightly different semantics than it would
>> have if the compiler already supported overloading of functions
>> against function templates.
>>
>> If exactly one of two equally good matched functions is a templated
>> one, the other one is chosen.
>
> So the D code in my first post may work and thus the workaround is not
> necessary.
>

The language does not mandate the workaround, but the workaround is 
necessary until the compiler is fixed.


More information about the Digitalmars-d-learn mailing list