<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2013/9/26 Sven Barth <span dir="ltr"><<a href="mailto:pascaldragon@googlemail.com" target="_blank">pascaldragon@googlemail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="im">
​After change to this code in Clone(), I got this error:<br>
<br>
​<br>
​tree.pas(66,60) Error: Incompatible type for arg no. 2: Got<br>
"TIntTree.TTree$LongInt", expected "TTree"<br>
</div></blockquote>
<br>
Seems like a bug in 2.6.x. It's compiling in 2.7.1.<br></blockquote></div><br><div class="gmail_default" style="font-family:courier new,monospace">​I altered the code so that it works in 2.6.2:<br><br></div><div class="gmail_default" style="font-family:courier new,monospace">

=== test program ===<br></div><div class="gmail_default" style="font-family:courier new,monospace">program test;<br>{$mode objfpc}{$H+}<br>uses tree;<br>type<br>  TIntTree = class(specialize TTree<Integer>)<br>  public<br>

    function Clone: TIntTree;<br>  end;<br><br>function TIntTree.Clone: TIntTree;<br>begin<br>  Result := TIntTree.Create(Data, FParent);<br>  DoClone(Result);<br>end;<br><br>var<br>  it1, it2 : TIntTree;<br>begin<br>  it1 := TIntTree.Create(1, nil);<br>

  it2 := it1.Clone;<br>  WriteLn(it1.ClassName);<br>  WriteLn(it2.ClassName);<br>end.​</div><br><div class="gmail_default" style="font-family:courier new,monospace">​=== tree clone code ===​</div><div class="gmail_default" style="font-family:courier new,monospace">

​type<br>  generic TTree<T> = class<br>    ... ...<br>  protected<br>    procedure DoClone(Target: TTree);<br>  public<br>    ... ...<br>    function Clone: TTree;<br>    ... ...<br>  end;<br><br>implementation<br>
<br>
procedure TTree.DoClone(Target: TTree);<br>var<br>  node: TTree;<br>begin<br>  node := FirstChild;<br>  while node <> nil do begin<br>    node.Clone.Remove(Target);<br>    node := node.NextSibling;<br>  end;<br>end;<br>

<br>function TTree.Clone: TTree;<br>begin<br>  Result := TTree.Create(Data, FParent);<br>  DoClone(Result);<br>end;<br><br>=======​</div><br><div class="gmail_default" style="font-family:courier new,monospace">​Is there any problem with this solution? <br>

<br></div><div class="gmail_default" style="font-family:courier new,monospace">Regards,<br></div><div class="gmail_default" style="font-family:courier new,monospace">Xiangrong​</div><br></div></div>