title: "use of class template requires template argument list" error, even though template of template is used, therefore template class is expected
body: <h2>context/ultimate wish (though barely relevant to the question)</h2>
  
  <p>do a benchmark for lots of sizes for lots of containers for lots of element types.</p>
  
  <p>at least I would like to have a template combiner of type-lists to create a foreach(foreach) scheme. (obtain a 16-elements list from two 4-elems lists.)</p>
  
  <p><strong>I do not have boost mpl, nor C++11.</strong> :'(</p>
  
  <p>I am trying at first to create a list of pairs with the first element of list1 being repeated all over a new list, where second elements would be copies of elements of list2.
  that would be the first step. (final goal is to obtain a list of the size of list1, made of list of pairs with all the combinations.)</p>
  
  <p>anyway I bump into a little practical issue, where I have a Transform meta function that accepts only a Predicate with 1 template argument as the transformer function.</p>
  
  <p>But I wish to create a closure from a 2 argument metafunction to one that takes 1 argument but has stored the first during typedefing.</p>
  
  <p>I did that:</p>
  
  <pre><code>template &lt; template &lt;class&gt; class Principal, typename TypeListN_T &gt;
  struct Transform
  {
      typedef typename detail::TransformAux&lt;Principal, TypeListN_T, EmptyT, Length&lt;TypeListN_T&gt;::value - 1 &gt;::Value_t Value_t;
  };
  
  
  template &lt; typename T1, typename T2 &gt;
  struct Pair
  {
      typedef T1 First_t;
      typedef T2 Second_t;
  };
  
  template &lt; typename T1, typename T2 &gt;
  struct MakePair
  {
      typedef Pair&lt; T1, T2 &gt; Value_t;
  };
  
  template &lt; template &lt; class, class &gt; class Binary, typename T &gt;
  struct Unarify
  {
      template &lt; typename T2 &gt;
      struct U
      {
          typedef Binary&lt; T, T2 &gt; value_t;
      };
  };
  
  // create a list of " Pair&lt;Tfirst, List::At&lt; i &gt; &gt; " for each i in List.
  template &lt; typename TFirst, typename List &gt;
  struct EmplaceListInSecond
  {
      typedef typename List::Head_t ToPlaceRightT;
      typedef TFirst                ToPlaceLeftT;
  
      template &lt; typename T &gt;
      struct UnaryPairMaker : Unarify&lt; MakePair, ToPlaceLeftT &gt;::U
      {
      };
  
      typedef typename Transform&lt; UnaryPairMaker, List &gt;::Value_t Value_t;
  };
  </code></pre>
  
  <h2>The real problem</h2>
  
  <p>the compiler (visual studio 2012), is giving me:</p>
  
  <blockquote>
    <p>1>..\BenchmarkApp.cpp(648): error C2955: 'Meta::Unarify::U'
    : use of class template requires template argument list</p>
  </blockquote>
  
  <p>this happens on the last-fifth line in the code extract.
  on this line:</p>
  
  <pre><code>struct UnaryPairMaker : Unarify&lt; MakePair, ToPlaceLeftT &gt;::U
  </code></pre>
  
  <p>Which I find super strange, because I am placing a 2-args template class (MakePair) into the template-template parameter of Unarify, where normally it should be accepted.</p>
  
  <p>It should be accepted because the first template argument of Unarify is supposed to be a template class. And the compiler complains that it .... is a template class....</p>
  
  <p>what the hell is going on here ?</p>
  
  <h2>EDIT : Solution</h2>
  
  <p>Here guys/girls for you future readers, like WhozCraig and Marco A. both mentioned, the problem was <code>::U</code> and not <code>MakePair</code>. Crazy quick code scanning ability guys, respect.</p>
  
  <pre><code>template &lt; template &lt; class, class &gt; class Binary, typename T &gt;
  struct Unarify
  {
      template &lt; typename T2 &gt;
      struct U
      {
          // little fix here compared to previous version ::Value_t wasnt called.
          typedef typename Binary&lt; T, T2 &gt;::Value_t Value_t;
      };
  };
  
  // create a list of " Pair&lt;Tfirst, List::At&lt; i &gt; &gt; " for each i in List.
  template &lt; typename TFirst, typename List &gt;
  struct EmplaceListInSecond
  {
      typedef typename List::Head_t ToPlaceRightT;
      typedef TFirst                ToPlaceLeftT;
  
      // big fix here, ::U is a template class that needed an argument (INDEED !!)
      // I was mistakenly taking the message for a MakePair problem, maybe would
      // have it been cland I would have seen the column number. well whatever...
      // T is the actual PLACEHOLDER that will accept the values passed during
      // visitation by the Transform function, and it is the type we want for U's T2 !    
      template &lt; typename T &gt;
      struct UnaryPairMaker : Unarify&lt; MakePair, ToPlaceLeftT &gt;::template U&lt;T&gt;
      {
      };
  
      typedef typename Transform&lt; UnaryPairMaker, List &gt;::Value_t Value_t;
  };
  </code></pre>
  
  <p>There we go. it IS POSSIBLE MAN ! Yes, it is possible to close a type from a binary metafunction into an unary metafunction passable to a meta-algorithm that takes a unary metafunction as a functor. hehe. C++ just freaking rocks.</p>