Re: template template arguments: expected a class template, got `Component<T1,
 T2, T3>
 
gary.bernstein@gmail.com wrote:
Any idea why line 57 fails? http://rafb.net/p/86JdGg61.html
....
      MyShutdown(Caller& rCaller)
do you mean to be passing a reference or a pointer ?
         : mCaller(rCaller)
      {
      }
      void begin()
      {
         cout << "MyShutdown caller # " << mCaller.mnId << endl;
         exit(0);
      }
};
template <typename T1, typename T2, typename T3>
class Component
{
   public:
      Component(int n)
         : mnId(n)
      {
         gs = MyShutdown<Component, T1, T2, T3>(this);
Even though Component is an appropriate template, the compiler (rightly 
or wrongly (i'm not sure) is interpreting Component as the specialized 
type in this context.  BTW - this is a pointer no a reference.
....
Here is code that compiles - not sure if it does what you want.  Note 
that <: has special meaning in C++ (look up digraph) so make sure you 
leave a space between < and ::.
#include <iostream>
#include <string>
using namespace std;
class Shutdown
{
    virtual void begin()
    {
       cout << "shutdown" << endl;
       exit(0);
    }
};
Shutdown *gs;
template <template <class, class, class> class
Calling_Component, class T1, class T2, class T3>
class MyShutdown : public Shutdown
{
    typedef Calling_Component<T1, T2, T3> Caller;
    Caller& mCaller;
    public:
       MyShutdown(Caller& rCaller)
          : mCaller(rCaller)
       {
       }
       void begin()
       {
          cout << "MyShutdown caller # " << mCaller.mnId << endl;
          exit(0);
       }
};
template <typename T1, typename T2, typename T3>
class Component
{
    public:
       Component(int n)
          : mnId(n)
       {
          gs = new MyShutdown</* space */::Component, T1, T2, T3>(*this);
       }
       int mnId;
};
//} //namespace XX
int main()
{
    Component<int, int, string> c(5);
    MyShutdown< Component, int, int, string> s(c);
    s.begin();
}