未使用提示通用类中的重载方法

时间:2014-04-02 10:13:47

标签: delphi generics compiler-warnings delphi-xe5

我的项目中有一个generic class,它有两个具有不同可见性的重载方法,如下所示:

  • 一个private可见度和一些参数。它使用参数和一些私有结构(其中一些在构造函数中注入)来执行一些操作。
  • 第二个具有protected可见性的无参数。派生类使用此类来执行超类实现的操作。为了做到这一点calls the private method

这样可以正常工作,但编译器会发出一条提示消息,如下所示:

  

[dcc32提示] Project1.dpr(15):H2219私人符号' Bar'声明但从未使用

出于好奇,我试图重新创建课程,而不是一般课程。在这种情况下,编译器提示不会出现。

下面你可以找到一个简单的例子来证明这个案例:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type

  //class with generic type
  TFoo<T> = class
    private
      procedure Bar(param : string); overload;
    protected
      procedure Bar; overload;
  end;


  //class without generic type
  TFoo2 = class
    private
      procedure Bar(param : string); overload;
    protected
      procedure Bar; overload;
  end;

  //TFoo<T> methods
  procedure TFoo<T>.Bar(param: string);
  begin
    writeln('Foo<T>. this is a private procedure. ' + param);
  end;


  procedure TFoo<T>.Bar;
  begin
    writeln('Foo<T>. This is a protected procedure.');
    Bar('Foo<T>. calling from a protected one.');
  end;

  //TFoo2 methods
  procedure TFoo2.Bar(param: string);
  begin
    writeln('Foo2. this is a private procedure. ' + param);
  end;


  procedure TFoo2.Bar;
  begin
    writeln('Foo2. This is a protected procedure.');
    Bar('Foo2. calling from a protected one.');
  end;


var
  foo : TFoo<string>;
  foo2 : TFoo2;
begin
  try
    foo := TFoo<string>.Create;
    foo2 := TFoo2.Create;
    try
      foo.Bar;
      foo2.Bar;
      readln;
    finally
      foo.Free;
      foo2.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

在此示例中,未使用泛型类型,但没有必要证明这一点。我的真正的类确实使用它,并且还会出现编译器提示。

为什么这个编译器提示出现在泛型类中的任何想法?我在Delphi XE5上进行了测试。

更新:因为它似乎是编译器错误,我们提交了QC report

1 个答案:

答案 0 :(得分:3)

这是编译器错误。您应该提交质量控制报告。

有趣的是,您的代码甚至不能在较旧的Delphi版本上编译。例如,我无法在XE3上编译您的代码。对Bar的第一次调用失败了:

  

[dcc32错误]:E2250没有可以使用这些参数调用的“Bar”的重载版本

如果我记得这个问题与在.dpr文件中声明和实例化泛型类型有关。