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

Template implementation problem.

P: n/a
Me
I am not understanding an aspect of how to implement a class template in a
..cpp file.

What I do know is that there are at least two problems with my understanding
of how to accomplish the definition of a template outside the class. One
problem is how to refer to a typedef that is a member of the classe's public
interface in the .cpp file. The second problem is that if I modify my code
to use the template variables and not my typedefs, then it will compilem,
but there will be linker errors. When I used the typedefs in my .cpp file
the result was that the compiler thought I was defining a function template.

I would prefer to use my typdefs instead of the template argument names. For
instance,
typedef P priority_type;

Perhaps it is my use of default template arguments as well?

Below are the two files.

-------- message.h ----------
#ifndef MESSAGE_INC
#define MESSAGE_INC

#include <string>
using std::string;

template<class M = string, class P = int>
class Message {
public:
typedef M message_type;
typedef P priority_type;

explicit Message(const message_type& m, const priority_type& p = 1)
throw()
:message_(m), priority_(p) {}

priority_type getPriority() const throw();
message_type getMessage() const throw();
bool operator<(const Message& x) const throw();

private:
priority_type priority_;
message_type message_;
};

#endif

----- end of message.h ----------

----- message.cpp ----------
#include "message.h"

template<class M, class P>
inline
// I would like to use the "priority_type" typedef and not P, but it won't
work.
// Message<M,P>::priority_type Message<M,P>::getPriority() const throw()
P Message<M,P>::getPriority() const throw()
{
return priority_;
}

template<class M, class P>
inline
M Message<M,P>::getMessage() const throw()
{
return message_;
}

template<class M, class P>
inline
bool Message<M,P>::operator<(const Message& x) const throw()
{
return priority_ < x.priority_;
}

----- end of message.cpp ----------
Jul 19 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a

"Me" <al***********@rogers.com> wrote in message
news:56******************@news04.bloor.is.net.cabl e.rogers.com...
I am not understanding an aspect of how to implement a class template in a
.cpp file.

What I do know is that there are at least two problems with my understanding of how to accomplish the definition of a template outside the class. One
problem is how to refer to a typedef that is a member of the classe's public interface in the .cpp file.
This compiles

typename Message<M,P>::priority_type Message<M,P>::getPriority() const
throw()
{
return priority_;
}

You need to use typename so that the compiler can tell that
Message<M,P>::priority_type is a type and not something else.
The second problem is that if I modify my code
to use the template variables and not my typedefs, then it will compilem,
but there will be linker errors.


That's because your template code should be in header files only, all of
it. The entire template definition must be available to the compiler when
the template is used. The linker will not resolve templates. The easiest way
to achieve this is to put all template code in header files.

This question is covered in the FAQ

http://www.parashift.com/c++-faq-lit...html#faq-34.12

john
Jul 19 '05 #2

P: n/a
Me

"John Harrison" <jo*************@hotmail.com> wrote in message
news:bi************@ID-196037.news.uni-berlin.de...
This compiles

typename Message<M,P>::priority_type Message<M,P>::getPriority() const
throw()
{
return priority_;
}
Ah, that makes so much sense.
That's because your template code should be in header files only, all of
it. The entire template definition must be available to the compiler when
the template is used. The linker will not resolve templates. The easiest way to achieve this is to put all template code in header files.
I read the portion of The C++ Programming language that covers that. I
can't believe I didn't recall it.

This question is covered in the FAQ

http://www.parashift.com/c++-faq-lit...html#faq-34.12
john


Thank you so much for your help!, Me.

And thanks for not writing "RTFM". (:
Jul 19 '05 #3

P: n/a
Me
I was trying to use the "export" keyword, but I just found out that my
compiler doesn't support it yet!

Thanks, Me.

"Me" <al***********@rogers.com> wrote in message
news:Cv*****************@news04.bloor.is.net.cable .rogers.com...

"John Harrison" <jo*************@hotmail.com> wrote in message
news:bi************@ID-196037.news.uni-berlin.de...
This compiles

typename Message<M,P>::priority_type Message<M,P>::getPriority() const
throw()
{
return priority_;
}


Ah, that makes so much sense.
That's because your template code should be in header files only, all of it. The entire template definition must be available to the compiler when the template is used. The linker will not resolve templates. The easiest

way
to achieve this is to put all template code in header files.


I read the portion of The C++ Programming language that covers that. I
can't believe I didn't recall it.

This question is covered in the FAQ

http://www.parashift.com/c++-faq-lit...html#faq-34.12

john


Thank you so much for your help!, Me.

And thanks for not writing "RTFM". (:

Jul 19 '05 #4

P: n/a

"Me" <al***********@rogers.com> wrote in message
news:Sw******************@news04.bloor.is.net.cabl e.rogers.com...
I was trying to use the "export" keyword, but I just found out that my
compiler doesn't support it yet!

Thanks, Me.


You might be waiting a long time. Comeau C++ supports the export keyword.

http://www.comeaucomputing.com/

john
Jul 19 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.