2012-07-13 13 views
45

Delphi 2010'da projeye başladım, sonra XE'ye geçtim ve şimdi XE2'ye geçmeye çalışıyorum. XE2 (Güncelleme 4 Düzeltme 1) 'da derlendikten sonra, AV ile birim testleri başarısız oldu.Delphi XE2'de jenerik ve ileri bildirim kullanırken derleyici hatası

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. 

Program çıktıları:

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

o akort derleyici seçenekleri ile sorunu çözmek mümkün mü bazı ayıklama sonra, aşağıdaki kodu doğru derlenmiş olmadığını belli oldu?

Bu sorun başka biri tarafından tekrarlanıyor olsun?

P.S. QC107110

+0

Bunu QualityCentral'a gönderin. Ayrıca, ileriye dönük beyanlar nereye gelir. Bu tür tek beyanname kullanılmamaktadır. –

+0

Kod en basitleştirilmiş, böylece derleyici hatası yeniden üretildi. Gerçek bir proje ileri beyannamesi kullanılır. Bu sorun sadece bana değil, QC'ye yazarım. – Chaa

+0

Tamam. Hatayı gönderdiğinizde, daha da azaltmalısınız. İleriye dönük beyannameye uygun değil gibi görünüyor. Basitçe InstanceSize ile bir kod sorunu. Destek sözleşmeniz varsa, bir destek sorununu açabilirsiniz, ancak bunu yapmak bile bir yanıt alacağınız anlamına gelmez. –

cevap

4

o akort derleyici seçenekleri ile sorunu çözmek mümkün mü? Hiçbir

, sen ayarlama ile hatayı düzeltemez, bu derleyicisi (çok özel) bir böcek.

[Birisi bana söyleyebilir] Bu sorunun başka biri tarafından yinelenip yinelenmeyeceği?

Ben kodu yeniden, ancak yalnızca XE2 güncellemede 4.

I (bu sürümü gerekmez) XE3 bunu kontrol etmek mümkün değildi. XE4'te (yorumlara göre) sabitlenmiştir.

a:

Yani işe koduna sahip tek yolu etmektir. Gereksiz ileri beyanı kaldır.
b. Delphi'nin farklı bir sürümünü kullanın.