Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Free Pascal generics


Servy ©   (19.04.09 02:03

Недавно решил попробовать 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


Лекс Айрин   (12.07.17 20:20[1]

можно попробовать так


//////////////////////////////////////////////////////////
generic TIterator<TData> = class;

generic TContainer<TData> = class
function GetIterator: TIterator<TData>;
end;

generic TIterator<TData> = class
constructor Create(FParent: TContainer<TData>)
end;
////////////////////////////////////////////////////////////


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо