http://d.puremagic.com/issues/show_bug.cgi?id=9513



--- Comment #3 from Ivan Kazmenko <ga...@mail.ru> 2013-02-14 16:21:09 PST ---
(In reply to comment #1)
> The second program gives me:
> 
> temp.d(28): Error: template instance RedBlackTree!(element, lessfun)
> RedBlackTree!(element, lessfun) does not match template declaration
> RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false) if
> (is(typeof(binaryFun!(less)(T.init, T.init))))

Hmm, I just tried with the current release, DMD 2.061, and it gives me the same
error.  However, DMD 2.059 works with no complaint.

The problem arises from the constraint in RedBlackTree declaration:
-----
final class RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false)
    if(is(typeof(binaryFun!less(T.init, T.init))))
-----

The function taking ref arguments can not work for T.init and T.init since ref
implies lvalue.

Currently, I found two work-arounds, more or less clumsy.

The first one is to define the second function to avoid the check:
-----
// old one
bool lessfun (ref element a, ref element b)
{
    return a < b;
}

// new one
bool lessfun (element a, element b)
{
    return a < b;
}
-----

Obviously, this way, we need four identical functions to cover all possible
cases.

The second one is to use template and auto ref:
-----
bool lessfun (T) (auto ref T a, auto ref T b)
{
    return a < b;
}
-----

This works fine.  And this could be a suitable solution for the original
problem.  That is, implementing "a < b" in a similar way as the default
predicate for the RedBlackTree!(AnyStructType) container may be not that bad. 
But that makes me wonder: under the hood, does it still create the four
identical functions?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to