By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,820 Members | 1,187 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,820 IT Pros & Developers. It's quick & easy.

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

P: n/a
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 T3class 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 T3class
Calling_Component, class T1, class T2, class T3>
class MyShutdown : public Shutdown
{
typedef Calling_Component<T1, T2, T3Caller;

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, stringc(5);

MyShutdown<Component, int, int, strings(c);

s.begin();
}

Jun 8 '07 #1
Share this Question
Share on Google+
1 Reply


P: n/a
ga************@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, classclass
Calling_Component, class T1, class T2, class T3>
class MyShutdown : public Shutdown
{
typedef Calling_Component<T1, T2, T3Caller;

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, stringc(5);

MyShutdown< Component, int, int, strings(c);

s.begin();
}
Jun 8 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.