Issue with calling a method from template class
<p>I have a template class method like that:</p>

<pre><code>template&lt;class T&gt;
static tmpClass&lt;T&gt;* MakeInstance(T value)
{

  tmpClass&lt;T&gt; *pointer = new tmpClass&lt;T&gt;(value);

  return pointer;
}
</code></pre>

<p>And I used various ways to call this method:</p>

<p>Way 1:</p>

<pre><code>MakeInstance&lt;int&gt;(val); // This is OK.
</code></pre>

<p>Way 2:</p>

<pre><code>MakeInstance(int val); // ERROR: Expected '(' for function-style cast or type construction
</code></pre>

<p>Way 3:</p>

<pre><code>MakeInstance(int (val)); // This is also OK.
</code></pre>

<p>Way 4:</p>

<pre><code>MakeInstance(int, (val)); // The same issue with way 2
</code></pre>

<p>Way 5:</p>

<pre><code>MakeInstance((int), (val)); // ERROR: Expect expression with ","
</code></pre>

<p>Way 6:</p>

<pre><code>MakeInstance((int) val); // This is also OK.
</code></pre>

<p>Way 7:</p>

<pre><code>MakeInstance&lt;int val&gt;; // ERROR: Expected "&gt;"
</code></pre>

<p>So is there any difference between way 1,3,6? Why we can't use "," to split "T" and "value", just because we have to follow the template strictly? But why we can also have "T" in "&lt;>"?</p>
