Почему ошибка - это к разработчикам. Возможно компилятор не понимает, куда он должен производить инстанцирование этого Вашего integer.
Вы периодически забываете, что это Паскаль, а не С++ и не надо из него С++ сделать пытаться, как не надо пытаться добиться от него, чтобы всякая, простите, фигня, которая в С++ допустима, была допустима и тут. В данном случае это как если Вы по дорогу домой заодно подберете урну с мусором, которая Вам сто лет не снилась, и будете с нею в обнимку до дверей квартиры идти, а потом бросите.
Я уважаю разработчиков как людей, но хотелось бы чтобы компилятор изменился в лучшую сторону, а то получается, что даже верный код (синтаксически) не компилируется.
Всё правильно он сделал, он оставил только то что нужно для вызова ошибки. T может использоваться для элементов класса, но они не нужны для вызова ошибки.
А ошибок компиляции даже в неадекватном коде не должно быть.
Вы задали вопрос, посему ошибка. Я Вам на него ответил, как смог и указал причину. Теперь Вы начинаете меня спрашивать, почему Ваш код не работает. Я Вам попытался сказать, что тестирование компилятора на каких-то заумных конструкциях, которые мне ни разу в жизни не понадобились (и не знаю, зачем могли бы понадобиться) мне не шибко интересно. У меня другие проблемы, более земные.
Обнаружил странную вещь и не пойму - это ошибка или особенность реализации?
begin
var f:file of integer;
Rewrite(f,'probe.bin');
f.Seek(1000);
f.Truncate;
f.Close;
Reset(f,'probe.bin');
Writeln('FileSize=',f.FileSize);
f.Close
end.
Известно, что Seek(n) перемещает указатель на запись с номером n (отсчет от 0). Нигде я не нашел указаний на то, что должно произойти, если установить указатель за пределы файла. В приведенном примере создается пустой файл. Далее указатель перемещается на позицию перед записью с номером 1000, т.е. смещается на 4х1000=4000 байт от начала файла. Того, у которого пока нулевая длина (!) и ноль записей. Truncate усекает остальные (!) байты, файл закрываем и… получаем файл длиной 4000 байт, заполненный высококачественными двоичными нулями.
Если открыть существующий файл по Reset и с помощью Seek отправить указатель “в туманные дали”, то и в этом случае Truncate позволит эти самые дали сделать родными.
С одной стороны, мне нравится такой способ создавать пустые файлы “левой задней ногой”. А с другой, иногда хочется, чтобы Seek(f,ДалекоДалеко) становился на Eof в соответствии с Filesize. Может, тут как со срезами, нужны два Seek - мягкий и суровый? Ну или один, но с опцией…
@Admin: GitHub пока решил не засорять этими размышлизмами.
Да, не спорю - там - ошибка. With реализовывалась очень рано - для совместимости, потом когда появились женерики - не особо тестировалась с ними, потому что стоит только начать… Там по-существу надо вообще запрещать использование with с женериками