problem with inner class involving template

Discussion in 'C++' started by darkstorm, Apr 27, 2005.

  1. darkstorm

    darkstorm Guest

    Please check this program...When I compiles it in VC.net, it gives the
    following error:
    ===============
    Common\Lib\PList.h(115): error C2440: '=' : cannot convert from
    'ListNode *' to 'List<T>::ListNode *'
    with
    [
    T=float
    ]
    Types pointed to are unrelated; conversion requires
    reinterpret_cast, C-style cast or function-style cast
    project\Source\Levelmgr.cpp(198) : while compiling
    class-template member function 'List<T>::Iterator::Iterator(List<T>
    *)'
    with
    [
    T=float
    ]
    project\Source\Levelmgr.cpp(15) : see reference to class
    template instantiation 'List<T>::Iterator' being compiled
    with
    [
    T=float
    ]

    ===============
    when I tried to change it to

    template<typename T>
    List<T>::ListNode * List<T>::Head(void)
    {
    return m_pstart;
    }

    instead of

    template<typename T>
    ListNode * List<T>::Head(void)
    {
    return m_pstart;
    }, it gives the error:
    ======================
    Common\Lib\PList.h(89): error C2065: 'T' : undeclared identifier
    ======================

    Could anyone please explain what is wrong here?

    Thanks,

    CODE:
    ______________________________________________________________________________

    #ifndef PLIST__H__
    #define PLIST__H__

    class ListNode;

    /**
    LinkedList class
    */
    template<typename T>
    class List
    {

    public:
    void Init(void);
    void Cleanup(void);
    BOOL AddItem(T data);
    ListNode * Head(void);

    private:
    /**
    A node of the list
    */
    class ListNode
    {
    ListNode(void){}
    ListNode(const T& data, ListNode *next):m_data(data), m_next(next){}

    public:
    T m_data; ///<data
    ListNode *m_next; ///<link to the next node
    };

    uint16 m_num_elems; ///<Number of elements in the list
    ListNode *m_pstart; ///<Pointer to the first element of the list

    public:
    class Iterator
    {
    public:
    Iterator(List<T> *plist);
    void operator++(void);
    T Content(void);

    private:
    List<T> *m_plist; ///<Pointer to the list
    ListNode *m_plistnode; ///<Pointer to the listnode
    };
    };

    //////////////////////////////////////////////////////////
    //List
    //////////////////////////////////////////////////////////

    /**
    Init List
    */
    template<typename T>
    void List<T>::Init(void)
    {
    m_num_elems = 0;
    m_pstart = NULL;
    }

    /**
    Add item to the front of the list
    \param[in] data Data to be stored in the list
    */
    template<typename T>
    BOOL List<T>::AddItem(T data)
    {
    BOOL res = TRUE;
    m_pstart = new ListNode(data, m_pstart);
    if(!m_pstart)
    {
    LOG_FAILED;
    ERXIT;
    }
    m_num_elems++;
    xit:
    LOG_IF_FAILED;
    return res;
    }

    /**
    Get the pointer to the first item in the list
    */
    template<typename T>
    ListNode * List<T>::Head(void)
    {
    return m_pstart;
    }

    /**
    Cleanup routine
    */
    template<typename T>
    void List<T>::Cleanup(void)
    {

    }

    ////////////////////////////////////////////////////////////
    //Iterator
    ///////////////////////////////////////////////////////////

    /**
    CTOR for iterator
    \param[in] plist Pointer to list
    */
    template<typename T>
    List<T>::Iterator::Iterator(List<T> *plist)
    :m_plist(plist)
    {
    m_plistnode = plist->Head();//<------ERROR
    }

    /**
    Increment operator
    */
    template<typename T>
    void List<T>::Iterator::eek:perator++(void)
    {
    m_plistnode = m_plistnode->m_next;
    }

    /**
    Get the content of the node iterator currently points
    return content of the node iterator currently points
    */
    template<typename T>
    T List<T>::Iterator::Content(void)
    {
    return m_plistnode->m_data;
    }

    #endif//PLIST__H__
     
    darkstorm, Apr 27, 2005
    #1
    1. Advertising

  2. darkstorm wrote:
    > Please check this program...When I compiles it in VC.net, it gives the
    > following error:
    > =============== [...]
    > when I tried to change it to
    >
    > template<typename T>
    > List<T>::ListNode * List<T>::Head(void)


    Shouldn't this be

    template<typename T>
    typename List<T>::ListNode * List<T>::Head()

    ???

    > {
    > return m_pstart;
    > }
    > [...]


    Anyway, see my other reply too.
     
    Victor Bazarov, Apr 27, 2005
    #2
    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. E11
    Replies:
    1
    Views:
    4,799
    Thomas Weidenfeller
    Oct 12, 2005
  2. darkstorm
    Replies:
    3
    Views:
    499
    Victor Bazarov
    May 2, 2005
  3. christopher diggins
    Replies:
    16
    Views:
    761
    Pete Becker
    May 4, 2005
  4. Pyenos
    Replies:
    2
    Views:
    392
    Pyenos
    Dec 27, 2006
  5. Fei Liu
    Replies:
    4
    Views:
    358
    Fei Liu
    Jan 8, 2008
Loading...

Share This Page