Template implementation problem.

Discussion in 'C++' started by Me, Aug 30, 2003.

  1. Me

    Me Guest

    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>::eek:perator<(const Message& x) const throw()
    {
    return priority_ < x.priority_;
    }

    ----- end of message.cpp ----------
     
    Me, Aug 30, 2003
    #1
    1. Advertising

  2. "Me" <> wrote in message
    news:56%3b.99645$...
    > 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-lite/containers-and-templates.html#faq-34.12

    john
     
    John Harrison, Aug 30, 2003
    #2
    1. Advertising

  3. Me

    Me Guest

    "John Harrison" <> wrote in message
    news:bipvvi$bs6bt$-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-lite/containers-and-templates.html#faq-34.12
    >
    > john
    >
    >


    Thank you so much for your help!, Me.

    And thanks for not writing "RTFM". :)
     
    Me, Aug 30, 2003
    #3
  4. Me

    Me Guest

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

    Thanks, Me.

    "Me" <> wrote in message
    news:Cv%3b.99825$...
    >
    > "John Harrison" <> wrote in message
    > news:bipvvi$bs6bt$-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-lite/containers-and-templates.html#faq-34.12
    > >
    > > john
    > >
    > >

    >
    > Thank you so much for your help!, Me.
    >
    > And thanks for not writing "RTFM". :)
    >
    >
     
    Me, Aug 30, 2003
    #4
  5. "Me" <> wrote in message
    news:Sw%3b.99835$...
    > 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
     
    John Harrison, Aug 30, 2003
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Theis
    Replies:
    2
    Views:
    486
    Chris Theis
    Jul 24, 2003
  2. er
    Replies:
    1
    Views:
    348
  3. Michael Tsang
    Replies:
    32
    Views:
    1,139
    Richard Bos
    Mar 1, 2010
  4. Michael Tsang
    Replies:
    54
    Views:
    1,219
    Phil Carmody
    Mar 30, 2010
  5. sanket
    Replies:
    7
    Views:
    1,046
    Tsung
    Nov 3, 2011
Loading...

Share This Page