Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Generics vs. модули - конфликт областей видимости, Странная ошибка компилирования 
V
    Опции темы
Skiminok
Дата 3.11.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.4.2006
Где: Киев

Репутация: нет
Всего: нет



Приветствую весь честной люд. У меня вопрос по Delphi 2009. Надеюсь, на форуме найдутся люди, которые уже экспериментировали с дженериками и смогут ответить на один маленький вопрос по очень странной ошибке...

Я решил попробовать воспользоваться новой, обобщённой версией библиотеки DeCAL (Delphi Container and Algorithm Library) - DeCAL2009. Но тут код, использовавший DMap из старой версии DeCAL, даже после пары очевидных переделок, напрочь отказался компилироваться. Тогда я решил выделить это использование в маленькую, упрощённую программу, и добился появления той же ошибки. Ошибки странной и дурацкой, я не могу её понять.

Вот простая и маленькая программа:
Код
program Project1;

{$APPTYPE CONSOLE}

uses
  DeCAL.Algo in 'DeCAL.Algo.pas',
  DeCAL.Containers in 'DeCAL.Containers.pas',
  DeCAL.Identity in 'DeCAL.Identity.pas',
  mwFixedRecSort in 'mwFixedRecSort.pas',
  Unit1 in 'Unit1.pas';

var
  It: DIterator<TSmth>;

begin
  a := DMap<String, TSmth>.Create;
  a.add('1', smOne);
  a.add('2', smTwo);
  a.add('3', smThree);
  It := a.locate('2');
  Writeln(Integer(It.get));
  a.Free;
end.


Она, как видите, используется нижеприведённый модуль:
Код
unit Unit1;

interface

uses
  DeCAL.Containers;

type
  TSmth = (smOne, smTwo, smThree);

var
  a: DMap<String, TSmth>;

implementation

end.


Компилятор выдаёт следующее:
E2010 Incompatible types: 'DIterator<Unit1.TSmth>' and 'DIterator<TSmth>.'
Что значит несовместимы? Это один и тот же generic, инстациированный одним и тем же типом! Единственное различие - что переменная "а" находится в отдельном модуле. Кстати, если перенести её непосредственно в текст основной программы, ошибка исчезает... но меня такое решение по разным причинам не устраивает.
Пытался добавить в разные места кода уточнение "Unit1." - безрезультатно.

Кто что может сказать по поводу?

З.Ы.
Вот объявление метода DMap.locate в DeCAL.Containers.pas:
Код
type
  DMap<TKey,TValue> = class
  // ...
    function locate(const key: TKey): DIterator<TValue>;
  // ...
end;


Это сообщение отредактировал(а) Skiminok - 3.11.2008, 20:48
PM MAIL   Вверх
Skiminok
Дата 3.11.2008, 20:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.4.2006
Где: Киев

Репутация: нет
Всего: нет



Вопрос снят Крэйгом Станцем на forums.codegear.com.
Оказывается, дженерики для глобальных переменных попросту не поддерживаются. После следующего маленького видоизменения ошибка исчезла бесследно:

Unit1.pas:
Код
type
  TSmth = (smOne, smTwo, smThree);
  TGlobals = class
    class var
      a: DMap<String, TSmth>;
  end;


Project1.dpr:
Код
With TGlobals do begin
    a := DMap<String, TSmth>.Create;
    a.add('1', smOne);
    a.add('2', smTwo);
    a.add('3', smThree);
    It := a.locate('2');
    Writeln(Integer(It.get));
    a.Free;
  end;


Это сообщение отредактировал(а) Skiminok - 3.11.2008, 20:48
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.