On Wednesday, 11 June 2014 at 18:07:44 UTC, matovitch wrote:
source/app.d(5): Error: basic type expected, not cast
source/app.d(5): Error: no identifier for declarator int
source/app.d(5): Error: semicolon expected to close alias declaration
source/app.d(5): Error: Declaration expected, not 'cast'
Error: DMD compile run failed with exit code 1

This particular error stems from the fact that you can only define `alias this` to a symbol, but you are using a cast, which is an expression. For this, a helper function is required:

class A(Derived) {
    auto castHelper() {
        return (cast(Derived) this).x;
    }
}

(Note that you also need to remove the `ref` inside the cast, because classes are already reference types, and the `ref` would mean a reference to a reference.)

But this still doesn't work, as then the compiler crashes while it tries to do the cast, iff the alias this is there. This works:

import std.stdio;

class A(Derived)
{
    auto castHelper() {
        return (cast(Derived) this).x;
    }
    //alias castHelper this;
}

class B : A!B
{
    float x;
}

class C : A!C
{
    int x;
}

void main()
{
    auto b = new B;
    b.x = 0.5;
    auto c = new C;
    c.x = 42;

    float f = b.castHelper;
    writeln("b = ", f);
    int i = c.castHelper;
    writeln("c = ", i);
}


But if you enable the `alias this` line, it segfaults. You don't even need to reduce the calls to `castHelper` in the main function, it evidently doesn't get that far.

Reply via email to