template template arguments: expected a class template, got `Component<T1, T2, T3>

G

gary.bernstein

Any idea why line 57 fails? http://rafb.net/p/86JdGg61.html

gs = MyShutdown<Component, T1, T2, T3>(this);

Errors:

shutdown1.cpp: In constructor `Component<T1, T2, T3>::Component(int)':
shutdown1.cpp:46: error: type/value mismatch at argument 1 in template
parameter list for `template<template<class T1, class T2, class T3>
class Calling_Comp
onent, class T1, class T2, class T3> class MyShutdown'
shutdown1.cpp:46: error: expected a class template, got
`Component<T1, T2, T3>'

#include <iostream>
#include <string>

using namespace std;


class Shutdown
{
virtual void begin()
{
cout << "shutdown" << endl;
exit(0);
}
};

Shutdown *gs;

template <template <class T1, class T2, class T3> 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 = MyShutdown<Component, T1, T2, T3>(this);
}

int mnId;
};

int main()
{
Component<int, int, string> c(5);

MyShutdown<Component, int, int, string> s(c);

s.begin();
}
 
G

Gianni Mariani

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();
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,121
Latest member
LowellMcGu
Top