У меня есть следующее объявление класса в Delphi X Е8:Использование собственного класса в качестве параметра типа ограничения в объявлении класса
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
Который проливает следующее сообщение об ошибке компилятора:
E2086 Type 'TestClass' is not yet completely defined
Когда я добавляю другой класс в смеси и использовать его в качестве ограничения вместо этого, он отлично работает:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
I susp Проблема заключается в том, что объявление прямого типа еще не сообщает Delphi о типе TestClass
. Это, пожалуй, более очевидна, так как следующая попытка обойти проблему бросает ту же самую ошибку компилятора на другой линии:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
Я делаю что-то неправильно, и если нет, то есть ли способ обойти эту проблему?
кажется, что это ошибка в компиляторе, так что я представил [сообщение об ошибке здесь] (https://quality.embarcadero.com/ просмотреть/RSP-13348). – overactor
Конечно, код «TestClass = class; AnotherTestClass = class (TestClass) // Ошибка компилятора end;" должен показать ошибку, потому что Delphi является компилятором с одним проходом. Но я не вижу причин, по которым то же самое следует применять к конструкции, которую вы пытаетесь создать. В то время достаточно информации, чтобы определение было действительным. – Dsm
@ Dsm согласился, но поскольку ошибка компилятора такая же, я понял, что это намек на то, что происходит не так. Однако это создает проблему, но если я хочу, чтобы два класса использовали eachother как ограничение параметра типа? – overactor