<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>