在Delphi XE2中使用泛型和转发声明时的编译器错误

前端之家收集整理的这篇文章主要介绍了在Delphi XE2中使用泛型和转发声明时的编译器错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我开始在Delphi 2010项目,然后迁移到XE,现在我试图迁移到XE2。
在XE2(更新4修补程序1)中编译后,单元测试开始与AV失败。
经过一些调试,很明显,下面的代码没有正确编译:
program ForwardDeclaration;

{$APPTYPE CONSOLE}

uses
    System.SysUtils;

type
    TEntityBase = class(TObject)
    protected
        FModel: Integer;
    public
        constructor Create(const AModel: Integer);
    end;

    TEntity<TKey> = class(TEntityBase)
    end;

    TMyEntity2 = class;

    TMyEntity1 = class(TEntity<Integer>)
        FData: Integer;
    end;

    TMyEntity2 = class(TMyEntity1)
    end;

constructor TEntityBase.Create(const AModel: Integer);
begin
    inherited Create;
    FModel := AModel;
end;

var
    MyEntity: TMyEntity1;
begin
    try
        Writeln(TEntityBase.ClassName,': ',TEntityBase.InstanceSize,' bytes');
        Writeln(TMyEntity1.ClassName,TMyEntity1.InstanceSize,' bytes');
        MyEntity := TMyEntity1.Create(100);
        Assert(MyEntity.FData = 0);
    except
        on E: Exception do Writeln(E.ClassName,E.Message);
    end;
end.

程序输出

TEntityBase: 12 bytes
TMyEntity1: 12 bytes <-- Must be 16 bytes!
EAssertionFailed: Assertion failure (ForwardDeclaration.dpr,line 41)

是否可以通过调整编译器选项来解决问题?

这个问题是否在别人重复?

P.S。
QC107110

解决方法

Is it possible to resolve the problem by tuning compiler options?

不,你不能通过调整来修复错误,它是一个(非常具体)编译器中的错误

[Can someone tell me] Whether this problem repeats at someone else?

我可以重现代码,但只能在XE2更新4。

我不能检查它在XE3(没有那个版本)。
它在XE4中固定(根据注释)。

因此,让代码工作的唯一方法是:

一个。删除不需要的前向声明。b。使用不同版本的Delphi。

原文链接:https://www.f2er.com/delphi/103843.html

猜你在找的Delphi相关文章