April 25, 2015
I ran into this infuriatingly confusing situation just now:

static assert(is(typeof(Parent.init.new Child) == Parent.Child)); // fine

alias P = Parent;
alias T = Parent.Child;

static assert(is(typeof(P.init.new T) == T)); // nope!

Wat???

After much confusion, I finally discovered this in my class:

class Parent {
    class Child { }
    mixin MyMixin;
}

mixin Template MyMixin() {
    private alias T = ...; // the culprit!
}

Should the private alias be able to escape? Is this a bug or expected behavior?

Also, is there a nice way to create template-level aliases in mixin templates that don't leak into the class? MyMixin generates multiple functions that all use T.
April 25, 2015
On Saturday, 25 April 2015 at 23:51:05 UTC, rcorre wrote:
> I ran into this infuriatingly confusing situation just now:
>
> static assert(is(typeof(Parent.init.new Child) == Parent.Child)); // fine
>
> alias P = Parent;
> alias T = Parent.Child;
>
> static assert(is(typeof(P.init.new T) == T)); // nope!
>
> Wat???
>
> After much confusion, I finally discovered this in my class:
>
> class Parent {
>     class Child { }
>     mixin MyMixin;
> }
>
> mixin Template MyMixin() {
>     private alias T = ...; // the culprit!
> }
>
> Should the private alias be able to escape? Is this a bug or expected behavior?
>
> Also, is there a nice way to create template-level aliases in mixin templates that don't leak into the class? MyMixin generates multiple functions that all use T.

You could namespace them in a sense by defining a nested struct that contains the aliases.