Connecting Tech Pros Worldwide Help | Site Map

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

gary.bernstein@gmail.com
Guest
 
Posts: n/a
#1: Jun 8 '07
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();
}

Gianni Mariani
Guest
 
Posts: n/a
#2: Jun 8 '07

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


gary.bernstein@gmail.com wrote:
Quote:
Any idea why line 57 fails? http://rafb.net/p/86JdGg61.html
....
Quote:
MyShutdown(Caller& rCaller)
do you mean to be passing a reference or a pointer ?
Quote:
: 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();
}
Closed Thread