Недавно решил попробовать FreePascal, обрадовало наличие generic'ов, которые раскрываются компилятором в compile time. Однако, даже после прочтение ихней pdf'ки не могу понять как сделать следующее:
Хочу создать два примерно таких generic класса:
generic TContainer<TData> = class
function GetIterator: TIterator<TData>;
end;
generic TIterator<TData> = class
constructor Create(FParent: TContainer<TData>)
end;
То есть, первый класс использует второй, а второй использует первый. Будь они обычными классами, достаточно было бы forward declaration одного из них вверху другого. Однако, моя попытка это сделать нарвалась на явный отказ компилятора:
generic TIterator<TData> = class;
generic TContainer<TData> = class
type public
TContainerIterator = specialize TIterator<TData>;
end;
generic TIterator<TData> = class
FField: Integer;
end;
TestProj.lpr(23,46) Error: Specialization is only supported for generic types
(на строке со специализацией TContainerIterator). То есть, при предварительном объявлении того, что, дескать, будет такой generic, как TIterator, компилятор почему-то не считает его generic'ом...
Попытка обойти этот эффект с помощью интерфейсов тоже не принесла результатов:
generic ICommonIterator<TData> = interface
end;
generic TContainer<TData> = class
type public
TContainerIterator = specialize ICommonIterator<TData>;
end;
generic TIterator<TData> = class(TInterfacedObject, ICommonIterator)
FField: Integer;
end;
TConcreteContainer = specialize TContainer<Integer>;
TestProj.lpr(27,53) Fatal: Syntax error, "," expected but ">" found
(на строке со специализацией TConcreteContainer). Тут, видимо, компилятору становится вообще плохо, раз он думает, что у generic'а стало больше одного параметра.
Если у кого-то есть идеи, как сделать задуманное мной, буду рад услышать. Или если кто-то в курсе, в какой версии компилятора планируется более адекватная поддержка generic'ов ^_^.
P.S.
Система: Windows XP
Среда разработки: Lazarus
Версия FPC: 2.2.2