如何在Delphi 2010下设置泛型类型的前向声明?

2024-01-16

我遇到了一个似乎非常经典的问题:一个项目和一个集合类,两者都互相引用,需要前向声明。我正在使用 Delphi 2010 更新 5。

这适用于非泛型类,但我无法解决泛型类型的 E2086 错误:

type
  // Forward declarations
  TMyElement = class; // E2086: Type 'TMyElement' is not yet completely defined

  TMyCollection<T:TMyElement> = class
    //
  end;

  TMyElement = class
    FParent: TMyCollection<TMyElement>;
  end;

切换类声明顺序时也会出现同样的问题。

我在此处或 QualityCentral 中没有找到任何对此问题的引用(发现了 E2086 的其他问题,但与此用例无关)

我现在唯一的解决方法是将父级声明为 TObject,并在需要时将其转换为集合泛型类型(不是一个干净的解决方案......)

您是如何解决这个问题的,或者是如何前向声明您的泛型类的?

Thanks,

[2011 年 10 月 22 日编辑] QualityCentral 的后续行动:我在质量中心报告了这个错误here http://qc.embarcadero.com/wc/qcmain.aspx?d=94044

EMB 最近已关闭该问题,解决状态如下: 分辨率:按设计 在构建中解决:16.0.4152

我只有 Delphi 2010。有人可以确认它已在 Delphe XE2 Update1 中修复吗?或者这是否意味着它“按预期”工作?

[编辑2011年10月23日] EMB的最终答复:EMB 今天确认,实际的 Delphi 编译器不支持使用泛型类型的前向声明。您可以通过上面提供的链接在 QC 中查看他们的答案。


您可以通过声明祖先类来解决这个问题:

type
  TBaseElement = class
  end;

  TMyCollection<T: TBaseElement> = class
  end;

  TMyElement = class(TBaseElement)
  private
    FParent: TMyCollection<TBaseElement>;
  end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Delphi 2010下设置泛型类型的前向声明? 的相关文章

随机推荐