Cha*_*ang 3 delphi smart-pointers
我在http://members.adug.org.au/2011/12/05/smart-pointers/中使用SmartPointer
我定义了一个IStringList:
type
IStringList = ISmartPtr<TStringList>;
Run Code Online (Sandbox Code Playgroud)
然后我可以使用如下没有内存泄漏提示:
var S: IStringList;
begin
S := TSmartPtr<TStringList>.Create();
S.Add('abc');
end;
Run Code Online (Sandbox Code Playgroud)
如果我在函数中使用IStringList作为结果数据类型:
function GetList: IStringList;
begin
Result := TSmartPtr<TStringList>.Create();
Result.Add('abc'); // E2010
end;
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
[dcc32 Error] Unit2.pas(31): E2010 Incompatible types: 'SmartPointer.ISmartPtr<System.Classes.TStringList>' and 'Procedure of object'
Run Code Online (Sandbox Code Playgroud)
解决方案解决方案是:
Result.Invoke.Add('abc');
Run Code Online (Sandbox Code Playgroud)
但这打败了使用SmartPointer的语法清洁的目的.有解决方案吗?
这是一个非常有趣的.无论出于何种原因,编译器都会Result与其他变量区别对待.我认为没有充分的理由,所以这感觉就像编译错误.
我看到一些解决方法:
Result.Result().Add('abc').FWIW,您可以通过剥离智能指针代码并删除泛型类型来大大简化问题.这是我能编写的最干净的SSCCE:
{$APPTYPE CONSOLE}
type
TFunc = reference to function: TObject;
procedure Foo;
var
F: TFunc;
begin
F.ClassName; // compiles
end;
function Bar: TFunc;
begin
Result().ClassName; // compiles
Result.ClassName; // [dcc32 Error] E2003 Undeclared identifier: 'ClassName'
end;
begin
end.
Run Code Online (Sandbox Code Playgroud)
我现在确信这是一个编译器错误.
它可能与Delphi相当不寻常的语言特性有关,这意味着对于没有参数的函数,可以省略函数调用括号.这种便利有时会带来歧义.但是,在这种情况下,没有歧义..当应用于a时,运算符没有意义TFunc<TObject>,因此解释这些语句的唯一方法是调用该函数,并将.运算符应用于返回的值.
错误报告:QC123218.