This is under Linux 64 with both dmd 2.066 (and latest gdc-4.9):

=================================================================
class ShapeSurface(T) {
public:
        int formula();
        int getSurfaceBy100() {
                int surface;
                surface = cast(T *)this.formula();
                return surface*100;
        };
};

class Square: ShapeSurface!Square
{
public:
        int squareSize = 8;
        override int formula() {
                return squareSize*squareSize;
        }
};

int main() {

        Square square = new Square();
        square.getSurfaceBy100();

        return 0;
}
=================================================================

It fails with linker error:

dmd app.d
app.o:(.data._D3app31__T12ShapeSurfaceTC3app6SquareZ12ShapeSurface6__vtblZ+0x28): undefined reference to `_D3app31__T12ShapeSurfaceTC3app6SquareZ12ShapeSurface7formulaMFZi'
collect2: error: ld returned 1 exit status
--- errorlevel 1

OK, maybe the cast is broken (well, to a pointer...), so changed this:

                surface = cast(T *)this.formula();
into this:
                T cls = cast(T)this;
                surface = cls.formula();

giving:

dmd app.d
app.o:(.data._D3app31__T12ShapeSurfaceTC3app6SquareZ12ShapeSurface6__vtblZ+0x28): undefined reference to `_D3app31__T12ShapeSurfaceTC3app6SquareZ12ShapeSurface7formulaMFZi'
collect2: error: ld returned 1 exit status
--- errorlevel 1

So, if you could tell me:

1) Why the compiler defer to the linker
2) What is the CRTP equivalent here

Many thanks.

Reply via email to