Ho la seguente dichiarazione di una classe a Delfi XE8:Utilizzando propria classe come vincolo parametro di tipo nella dichiarazione di classe
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
che getta il seguente errore del compilatore:
E2086 Type 'TestClass' is not yet completely defined
Quando aggiungo un'altra classe al mix e usa quella come vincolo invece, funziona bene:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
I susp Il problema è che la dichiarazione del tipo forward non dice ancora abbastanza a Delphi sul tipo TestClass
. Questo è forse più evidente in quanto il seguente tentativo di aggirare il problema getta lo stesso errore del compilatore su una linea diversa:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
sto facendo qualcosa di sbagliato e se non, c'è un modo per aggirare questo problema?
Sembra che questo è un bug nel compilatore così ho presentato una [segnalazione di bug qui] (https://quality.embarcadero.com/ sfogliare/RSP-13348). – overactor
Certamente il codice "TestClass = class; AnotherTestClass = class (TestClass) // Errore del compilatore fine;" dovrebbe produrre l'errore mostrato perché Delphi è un compilatore a passaggio singolo. Ma non vedo alcuna ragione per cui la stessa cosa dovrebbe applicarsi al costrutto che stai cercando di creare. Sono disponibili informazioni sufficienti al momento in cui la definizione è valida. – Dsm
@Dsm è d'accordo, ma poiché l'errore del compilatore è lo stesso, ho immaginato che sia un suggerimento a cosa sta andando male. Questo introduce un problema, tuttavia, cosa succede se voglio due classi che usano eachother come un vincolo del parametro di tipo? – overactor