Template class inside class template in c++
Solution 1
Your member function 'foo' needs a return type and you need to use the keyword 'template' when you use member templates in dependent expressions (expressions whose meanings rely directly or indirectly on a generic template parameter)
t_->template getMessageSender<MessageType>(); // ok
t_->getMessageSender<MessageType>(); // not ok
Perhaps this example will help you appreciate when a member template needs to be prefixed by the 'template' keyword [Note: in the interest of symmetry you may always use the 'template' prefix on member templates, but it is optional when used on a non-dependent expression.
struct MyType
{
template<class T> void foo() { }
};
template<class U>
struct S
{
template<class T>
void bar()
{
MyType mt; // non-dependent on any template parameter
mt.template foo<int>(); // ok
mt.foo<int>(); // also ok
// 't' is dependent on template parameter T
T t;
t.template foo<int>(); // ok
t.foo<int>(); // not ok
S<T> st; // 'st' is dependent on template parameter T
st.template foo<int>(); // ok
st.foo<int>(); // not ok
S<MyType> s; // non-dependent on any template parameter
s.bar<int>(); // ok
s.template bar<int>(); // also ok
}
};
Hope that helps.
Solution 2
Add the keyword template
between ->
and the name of the template method:
t_->template getMessageSender<MessageType>();
user106740
Updated on June 25, 2022Comments
-
user106740 almost 2 years
noob here still experimenting with templates. Trying to write a message processing class template
template <typename T> class MessageProcessor { //constructor, destructor defined //Code using t_ and other functions foo( void ) { //More code in a perfectly fine method } private: T *t_ };
All defined in a header file. I've built and tested my class and all is well. Now, I'm trying to do this:
template <typename T> class MessageProcesor { //Same stuff as before foo(void) { //Same code as before in foo, but one new line: t_->getMessageSender<MessageType>(); } private: T *t_; };
However, this line gives me an error of bad expression-type before '>' token.
I've added the necessary header files to define what a MessageType is. I've used this function many time before, just not in this context.
I suspect that the compiler doesn't like the fact that the template function is fully defined (specialized?) within an undefined class template (unspecialized?). I'm not fully grokking what makes a template 'specialized'. Most explanations center on the concepts of 'full' or 'partial', but not what makes it specialized in the first place.
Apologies if you'd like to see more code. I have no internet access at work and that's where I'm doing this, so I have to put everything into my mental 'scratchpad' and bring it home.
-
Edouard A. almost 15 yearsOn which compiler do you need to do that?
-
Faisal Vali almost 15 years@Edouard - The standard requires the 'template' prefix only when accessing member templates from an identifier that depends on a template parameter - most compilers should get this right since this has been part of the standard since '98 - in '03 they modified the rules for the sake of simplicity so that you could use it on all member template accesses - and asides from the EDG compilers (that do mostly get this right), i haven't checked it on any of the other compilers - please let me know if you have.