<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br></div>
When you instantiate MyStruct!5, it tries to define ret, so it instantiates MyStruct!4, MyStruct!3, ... and so on. You have to put a static if or something else to stop that.<br></blockquote><div><br></div><div>Like this:</div>
<div><br></div><div>import std.stdio;</div><div><br></div><div>struct MyStruct(uint K) if (K > 0) // Only to disable direct creation for K==0</div><div>{</div><div>    real[K] data;</div><div><br></div><div>    static if (K > 1) // getSmaller only exists for K > 1</div>
<div>        MyStruct!(K-1) getSmaller()</div><div>        {</div><div>            MyStruct!(K-1) ret;</div><div>            foreach( no, ref d; ret.data )</div><div>                d = data[no];</div><div>            return ret;</div>
<div>        }</div><div><br></div><div>    real recursionAlgo()</div><div>    {</div><div>        static if( K == 1 ) return data[0];</div><div>        else</div><div>        {</div><div>            real sum = 0;</div><div>
            foreach( i; 1 .. K )</div><div>                sum += getSmaller().recursionAlgo();</div><div>            return sum;</div><div>        }</div><div>    }</div><div>}</div><div><br></div><div>void main()</div><div>
{</div><div>    MyStruct!(5) a;</div><div>    a.data = [ 1, 2, 3, 4, 5 ];</div><div>    writeln( a.recursionAlgo() ); // 24</div><div>} </div></div>