关于C++模块的,求教
- C/C++ code
#ifndef MYLIST_HPP#define MYLIST_HPP#include <memory>template<typename T>class CMyList{private: // 结点 struct stNode { stNode(){memset(this, 0, sizeof(stNode));} T data; // 数据 stNode* pNext; // 下一结点 stNode* pPre; // 上一结点 private: stNode(const stNode& rhs); stNode& operator=(const stNode& rhs); };public: // 迭代器 class CIteaator { friend class CMyList<T>; public: CIteaator(stNode* pData = NULL) : m_pData(pData) {} ~CIteaator(){m_pData = NULL;} T& operator *(){return m_pData->data;} T* operator ->(){return &(m_pData->data);} const T& operator *()const{return m_pData->data;} const T* operator ->()const{return &(m_pData->data);} CIteaator& operator++(){m_pData = m_pData->pNext; return *this;} CIteaator operator++(int){CIteaator temp = *this; m_pData = m_pData->pNext; return temp;} bool operator ==(const CIteaator& rhs)const{return rhs.m_pData == m_pData;} bool operator !=(const CIteaator& rhs)const{return rhs.m_pData != m_pData;} private: stNode* m_pData; }; typedef CIteaator iterator; typedef const CIteaator const_iterator;public: CMyList(void){m_pHead = m_pEnd = new stNode;m_size = 0;} ~CMyList(void){clear(); delete m_pEnd; m_pHead = m_pEnd = NULL;} iterator begin()const{return iterator(m_pHead);} iterator end()const{return iterator(m_pEnd);} size_t size()const{return m_size;} bool empty()const{return m_size == 0;} iterator push_back(const T& value); iterator erase(const iterator& it); void clear();private: CMyList(const CMyList& rhs); CMyList& operator=(const CMyList& rhs);private: stNode* m_pHead; // 表头 stNode* m_pEnd; // 表尾 size_t m_size; // 元素个数};template<typename T>CMyList<T>::iterator<T> CMyList<T>::push_back(const T& value){ stNode* pNode = new stNode; pNode->data = value; pNode->pPre = m_pEnd->pPre; pNode->pNext = m_pEnd; if (0 == m_size++) { m_pHead = pNode; } else { m_pEnd->pPre->pNext = pNode; } m_pEnd->pPre = pNode; return iterator(pNode);}template<typename T>CMyList<T>::iterator<T> CMyList<T>::erase(const iterator& it){ if (it == end()) { return end(); } if (it == begin()) { stNode* pTemp = m_pHead; m_pHead = m_pHead->pNext; m_pHead->pPre = NULL; delete pTemp; --m_size; return iterator(m_pHead); } stNode* pTemp = it.m_pData->pNext; pTemp->pPre = it.m_pData->pPre; if (NULL != it.m_pData->pPre) { it.m_pData->pPre->pNext = pTemp; } else { m_pHead = pTemp; } delete it.m_pData; --m_size; return iterator(pTemp);}template<typename T>void CMyList<T>::clear(){ stNode* pNode = m_pHead; while (pNode != m_pHead) { stNode* pTemp = pNode->pNext; delete pNode; pNode = pTemp; } m_size = 0; m_pHead = m_pEnd;}#endif类外的那三个函数有问题,把他们移到类的内部是没问题的,请问我应该怎么改它们
多谢!!
[解决办法]
template<typename T>
typename CMyList<T>::iterator<T> CMyList<T>::push_back(const T& value)
所有的都加上
[解决办法]
大概讲一下
- C/C++ code
template<typename T> class A{ typedef int INT;} //在这个类版中 INT是类型template<typename T> class A{ enum {INT};}//在这个类模板中 INT是值
[解决办法]
- C/C++ code
#ifndef MYLIST_HPP#define MYLIST_HPP#include <memory>template<typename T>class CMyList{private: // 结点 struct stNode { stNode(){memset(this, 0, sizeof(stNode));} T data; // 数据 stNode* pNext; // 下一结点 stNode* pPre; // 上一结点 private: stNode(const stNode& rhs); stNode& operator=(const stNode& rhs); };public: // 迭代器 class CIteaator { friend class CMyList<T>; public: CIteaator(stNode* pData = NULL) : m_pData(pData) {} ~CIteaator(){m_pData = NULL;} T& operator *(){return m_pData->data;} T* operator ->(){return &(m_pData->data);} const T& operator *()const{return m_pData->data;} const T* operator ->()const{return &(m_pData->data);} CIteaator& operator++(){m_pData = m_pData->pNext; return *this;} CIteaator operator++(int){CIteaator temp = *this; m_pData = m_pData->pNext; return temp;} bool operator ==(const CIteaator& rhs)const{return rhs.m_pData == m_pData;} bool operator !=(const CIteaator& rhs)const{return rhs.m_pData != m_pData;} private: stNode* m_pData; }; typedef CIteaator iterator; typedef const CIteaator const_iterator;public: CMyList(void){m_pHead = m_pEnd = new stNode;m_size = 0;} ~CMyList(void){clear(); delete m_pEnd; m_pHead = m_pEnd = NULL;} iterator begin()const{return iterator(m_pHead);} iterator end()const{return iterator(m_pEnd);} size_t size()const{return m_size;} bool empty()const{return m_size == 0;} iterator push_back(const T& value); iterator erase(const iterator& it); void clear();private: CMyList(const CMyList& rhs); CMyList& operator=(const CMyList& rhs);private: stNode* m_pHead; // 表头 stNode* m_pEnd; // 表尾 size_t m_size; // 元素个数};template<typename T>typename CMyList<T>::iterator CMyList<T>::push_back(const T& value){ stNode* pNode = new stNode; pNode->data = value; pNode->pPre = m_pEnd->pPre; pNode->pNext = m_pEnd; if (0 == m_size++) { m_pHead = pNode; } else { m_pEnd->pPre->pNext = pNode; } m_pEnd->pPre = pNode; return iterator(pNode);}template<typename T>typename CMyList<T>::iterator CMyList<T>::erase(const iterator& it){ if (it == end()) { return end(); } if (it == begin()) { stNode* pTemp = m_pHead; m_pHead = m_pHead->pNext; m_pHead->pPre = NULL; delete pTemp; --m_size; return iterator(m_pHead); } stNode* pTemp = it.m_pData->pNext; pTemp->pPre = it.m_pData->pPre; if (NULL != it.m_pData->pPre) { it.m_pData->pPre->pNext = pTemp; } else { m_pHead = pTemp; } delete it.m_pData; --m_size; return iterator(pTemp);}template<typename T>void CMyList<T>::clear(){ stNode* pNode = m_pHead; while (pNode != m_pHead) { stNode* pTemp = pNode->pNext; delete pNode; pNode = pTemp; } m_size = 0; m_pHead = m_pEnd;}#endif