On Tuesday, 14 July 2015 at 14:02:46 UTC, jmh530 wrote:
Thanks for posting that. I figured out the issue. Before you had recommended that I use
alias cos = std.math.cos;
I had kept that text in. When I removed it, everything worked just fine. I'm still not sure I grasp the subtleties of alias when used with templates.

Oh that's another goodie. So you had a situation like this:
----
import std.math;

alias cos = std.math.cos;

mixin template t()
{
    void cos(real[] arr) {/* ... */}
}

mixin t!();

void main()
{
    cos([1, 2, 3]);
}
----

This fails with "Error: None of the overloads of 'cos' are callable using argument types (int[])".

The problem is that template mixins cannot add to existing overload sets. The spec says: "If the name of a declaration in a mixin is the same as a declaration in the surrounding scope, the surrounding declaration overrides the mixin one" [1]. That means, the `cos` from `alias cos = std.math.cos;` completely overrides the one from `mixin t!();`. I guess this is a measure against function hijacking again.

I'm not sure if it's supposed to work like it does when the alias is removed, two implicitly imported/generated symbols forming an overload set. But I can't immediately see a problem with it either.

[1] http://dlang.org/template-mixin.html - see "Mixin Scope"

Reply via email to