The snippet below is successfully compiled by gcc 4.7.2:<br><br><pre style="margin-left:40px" class="lang-c prettyprint prettyprinted"><code><span class="kwd">template</span><span class="pln"> </span><span class="pun"><</span><span class="kwd">typename</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">unsigned</span><span class="pln"> N</span><span class="pun">></span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">Helper</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">

</span><span class="kwd">template</span><span class="pln"> </span><span class="pun"><</span><span class="kwd">typename</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">unsigned</span><span class="pln"> N </span><span class="pun">></span><span class="pln">
</span><span class="typ">Helper</span><span class="pun"><</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> N </span><span class="pun">></span><span class="pln"> </span><span class="typ">GetHelper</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Helper</span><span class="pun"><</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> N </span><span class="pun">></span><span class="pln"> </span><span class="pun">();</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="kwd">template</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="kwd">typename</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">unsigned</span><span class="pln"> N </span><span class="pun">></span><span class="pln">
</span><span class="kwd">struct</span><span class="pln"> X </span><span class="pun">{</span><span class="pln">
    X</span><span class="pun">(</span><span class="pln"> </span><span class="typ">Helper</span><span class="pun"><</span><span class="pln"> T</span><span class="pun">,</span><span class="pln"> N </span><span class="pun">></span><span class="pln"> h </span><span class="pun">=</span><span class="pln"> </span><span class="typ">GetHelper</span><span class="pun"><</span><span class="pln">T</span><span class="pun">,</span><span class="pln"> N</span><span class="pun">>()</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="pun">};<br><br></span></code></pre>With clang 3.2 though it spews a lot of errors:<br><br><div style="margin-left:40px"><span style="font-family:times new roman,serif">Compilation finished with errors:<br>
source.cpp:9:40: error: unknown type name 'N'<br>    X( Helper< T, N > h = GetHelper<T, N>() ) {}<br>                                       ^<br>source.cpp:9:41: error: expected ')'<br>    X( Helper< T, N > h = GetHelper<T, N>() ) {}<br>
                                        ^<br>source.cpp:9:6: note: to match this '('<br>    X( Helper< T, N > h = GetHelper<T, N>() ) {}<br>     ^<br>source.cpp:9:38: error: expected '>'<br>
    X( Helper< T, N > h = GetHelper<T, N>() ) {}<br>                                     ^<br>3 errors generated.</span><br></div><br>for the exact position of the carets, you can see: <a href="http://liveworkspace.org/code/3EALA5$27">http://liveworkspace.org/code/3EALA5$27</a><br>
<br>- the first caret is positionned under the N of GetHelper<T, N>()<br>- the second caret is positionned under the > of GetHelper<T, N>()<br>- the fourth caret is positionned under the comma of GetHelper<T, N>()<br>
<br>I suspect a clang bug, given that gcc manages to compile the code.<br><br>Note: related SO question => <a href="http://stackoverflow.com/q/14401308/147192">http://stackoverflow.com/q/14401308/147192</a><br><br>-- Matthieu<br>