Thank you Timon,  I very much appreciate your (and others) help.<div><br></div><div>I will look all this up in the online docs and the book. </div><div><br></div><div>There is still some very odd things in how these fit together. For example, if I comment out the last 3 function templates, I get all "simpleparms", which is expected. </div>
<div><br></div><div>But if I add in the fourth, I get a compilation error saying the call to abc(arr2) is ambiguous. So even though the first one specifies "U = void" and "size_t N = 0", and the fourth specifies something very different, there is ambiguity between them. </div>
<div><br></div><div>Adding in the third resolves the ambiguity between the first and fourth.</div><div> </div><div>John</div><div><br><div class="gmail_quote">On Sat, Oct 29, 2011 at 4:02 PM, Timon Gehr <span dir="ltr"><<a href="mailto:timon.gehr@gmx.ch">timon.gehr@gmx.ch</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im"><br></div>
This works:<br>
<br>
void abc(T, U=void, size_t N=0) (T parm1) {<br>
    writeln("simpleparm: ", parm1);<br>
}<br><div class="im">
<br>
void abc(T: string) (T parm1) {<br>
    writeln("string : ", parm1);<br>
}<br>
<br>
void abc(T:U[], U) (T parm1) if (isDynamicArray!T) {<br>
    writeln("dynamic array : ", parm1);<br>
 }<br>
<br></div>
void abc(T:U[N], U, size_t N) (T parm1) {<br>
    writeln("static array : ", parm1);<div class="im"><br>
}<br>
<br>
void main(string[] args) {<br>
    abc(1);<br>
    abc("str");<br>
    int[] arr = [1, 2];<br>
    abc(arr);<br></div><div class="im">
    int[2] arr2 =[3, 4];<br></div>
    abc(arr2);<br>
}<br>
</blockquote></div><br>
</div>