Ошибка Free Pascal 2.6.2 с конструктором TThread

Компилятор Free Pascal 2.6.2 (использующий режим Delphi) жаловался на

program project16416258;

{$mode Delphi}

uses
  Classes;

type
  TFPCTestThread = class(TThread)
  public
    constructor Create(CreateSuspended: Boolean);
  end;

constructor TFPCTestThread.Create(CreateSuspended: Boolean);
begin
  inherited;
end;

begin
end.

с этим сообщением об ошибке:

ThroughputTestUnit.pas(82,19) Error: Wrong number of parameters
specified for call to "Create" Hint: Found declaration: constructor
TThread.Create(Boolean,const LongWord="4194304");

Я исправил это с помощью

  inherited Create (CreateSuspended);  

Кажется, это вызвано изменением в 2.6.2, TThread теперь имеет объявление конструктора с необязательным вторым аргументом:

 constructor Create(CreateSuspended: Boolean;
                    const StackSize: SizeUInt = DefaultStackSize);   

person mjn    schedule 07.05.2013    source источник
comment
покажите декларацию вашего конструктора TThroughputThread.Create: он помечен override? overload? c:\codetyphon\fpcsrc\rtl\objpas\classes\classesh.inc действительно имеет конструктор TThread с двумя параметрами, и они могут изменять свой RTL по своему усмотрению. Что может быть ошибкой, так это то, почему объявление вашего конструктора TThroughputThread.Create (не тело) даже скомпилировано?   -  person Arioch 'The    schedule 07.05.2013
comment
@Arioch'Посмотрите мое обновление   -  person mjn    schedule 07.05.2013
comment
И это не дало вам предупреждений о том, что это маскирует метод Create базового класса? являются ли конструкторы особым случаем, что они не требуют явной маркировки с помощью reintroduce/overload/override ?   -  person Arioch 'The    schedule 07.05.2013
comment
@Arioch'Нет, по крайней мере, в Lazarus 1.0.8 я не вижу предупреждений (подсказки и предупреждения включены)   -  person mjn    schedule 07.05.2013
comment
@Arioch, это предупреждение обычно относится только к виртуальным методам. Этот конструктор не является виртуальным, поэтому предупреждения нет. Конструктор TObject также не является виртуальным, поэтому вы также никогда не видели предупреждения при добавлении нового конструктора к какому-либо прямому потомку TObject.   -  person Rob Kennedy    schedule 07.05.2013


Ответы (1)


inherited; вызывает конструктор базового класса Create(CreateSuspended: Boolean). Поскольку в базовом классе нет конструктора, который принимает один логический аргумент, у вас есть ошибка.

person Sergej Christoforov    schedule 07.05.2013
comment
Второй аргумент в конструкторе является необязательным, поэтому это может быть совпадающая подпись. Однако я понимаю, что вызов унаследованного конструктора просто «унаследован»; не то же самое, что вызов унаследованного Create(CreateSuspended). - person mjn; 07.05.2013
comment
Правильно, Мин. Это не просто синтаксический сахар, позволяющий вам печатать меньше. Он имеет особое и четкое значение для вызова унаследованной версии текущего метода с текущими параметрами. Однако нет унаследованной версии вашего текущего метода. Это серьезное изменение в библиотеке FPC. - person Rob Kennedy; 07.05.2013