On 09/30/2014 10:35 AM, "Nordlöw" wrote:

> On Sunday, 28 September 2014 at 20:28:11 UTC, Jay wrote:
>> fwiw here's what i wrote:
>>
>> template New(T) if (is(T == class)) {
>>     T New(Args...) (Args args) {
>>         return new T(args);
>>     }
>> }
>
> My try
>
> template New(T) if (is(T == class))
> {
>      T New(Args...) (Args args) {
>          return new T(args);
>      }
> }
>
> unittest
> {
>      class C { int x, y; }
>      auto x = New!C;
> }
>
> fails as
>
> typecons_ex.d(60,16): Error: outer function context of
> typecons_ex.__unittestL64_4 is needed to 'new' nested class
> typecons_ex.__unittestL64_4.C
> typecons_ex.d(67,14): Error: template instance
> typecons_ex.New!(C).New!() error instantiating

Apparently, a class definition even inside a unittest blocks are considered to be nested classes.

Normally, objects of nested classes are created by the 'this.new' syntax, 'this' meaning the object that wraps the nested class.

class Outer
{
    class Inner
    {}

    Inner makeInner()
    {
        return this.new Inner();
    }
}

void main()
{
    Outer o = new Outer;
    Outer.Inner i = o.makeInner();
}

i contains a context pointer to its creators so that it can access the outer object's members.

To make a nested class unnested, declare it as static, which seems to work in your case as well:

    class C { int x, y; }
    auto x = New!C();

Ali

Reply via email to