title: Flexibility of template alias in C++0x
body: <p>As I understand, template aliases in C++0x will allow us to do the following:</p>
  
  <pre><code>template &lt;typename T&gt;
  using Dictionary = std::map&lt; std::string, T &gt;;
  
  Dictionary&lt;int&gt; ints;
  ints[ "one" ] = 1;
  ints[ "two" ] = 2;
  </code></pre>
  
  <p>I have two questions:</p>
  
  <p>First, will we be able to do this (bind to any type, or just templates):</p>
  
  <pre><code>template &lt;typename Iter&gt;
  using ValueType = std::iterator_traits&lt;Iter&gt;::value_type;
  </code></pre>
  
  <p>Second, will using the aliases require usage of the <code>typename</code> keyword in templates, e.g.:</p>
  
  <pre><code>template &lt;typename Iter&gt;
  typename ValueType&lt;Iter&gt; sum(Iter first, Iter last) { ... }
  // ^ required?
  </code></pre>
  
  <p>Or is it required in the alias declaration?</p>
  
  <pre><code>using ValueType = typename std::iterator_traits&lt;Iter&gt;::value_type;
  //                   ^ required?
  </code></pre>
  
  <p>Or neither?</p>