C++中模板类的继承问题
问题说明:
1、定义了一个myList的链表模板类;
2、定义了一个mySet的集合类,共有public继承myList模板类。
请问:
1、在for循环中出现了Node指针未定义问题;
2、开始时出现了Node指针p、pHead、Node未定义的错误;在p、Node、和pHead前面添加myList<T>::或者myset<T>::作用域限制后,Node和pHead错误消失;此时p仍有错误:p在此作用域未定义;
3、不知道为什么要在在Node结点前面添加myList<T>::或者myset<T>::作用域限制。
4、出错代码如下所示:
[code=C/C++][/code]
template <class T>
bool mySet<T>::Contains(T &t)
{
//myList<T>::Node *p;
//myList<T>::Node *
//;myset<T>换成myList<T>也可以;
//for (mySet<T>::Node *p = mySet<T>::pHead;p != NULL ; p = p->pNext) //此处出错?????
if ((p->data) == t)
return true;
return false;
}
错误提示:[Error] D:\C++学习\11\ListPro\mySet.h:22: error: `p' was not declared in this scope。
5、希望高手能指点一下,分数不多,倾囊而出!
6、程序源代码如下:
//myList类模板的定义;由于winGW不支持模板分离编译,故把myList模板类的声明和定义放在同一个头文件:myList.h
//*****************myList.h************************头文件*********************;
[code=C/C++][/code]
#ifndef _MYLIST_H_
#define _MYLIST_H_
///#include "myList.h"模板中的 .h 和 .cpp 文件必须放在一起, ,mingW不支持
//模板分离编译;vc应该可以的
/*
功能扩展:查找函数,比较函数,打印指定的元素;统计元素的个数;
*/
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
//定义一个带一个参数的list模板类 :mylist<T>
template <class T>
class myList
{
public:
myList();//构造函数 ;
void remove(T &);//删除一个元素;
void printList();//打印链表;
virtual void add(T &);//添加一个元素;
virtual ~myList();//析构函数;
protected:
struct Node//结点类型;
{
Node *pNext;
T data;
};
Node *pHead;//链表的表头;
};
template <class T>
myList<T>::myList()
{
pHead = NULL;
}
template <class T>
void myList<T>::add(T &t)
{
Node *temp = new Node;
temp->data = t;
temp->pNext = pHead;
pHead = temp;
}
template <class T>
void myList<T>::remove(T &t)
{
Node *q = 0;
//如果待删除结点是表头结点,则删除;表头。指针向下一个结点;
if ((pHead->data) == t)
{
q = pHead;
pHead = pHead->pNext;
}
//顺序查找待删除的节点;
else
{
for (Node *p = pHead; p->pNext != NULL; p = p->pNext)
if ((p->pNext->data) == t)
{
q = p->pNext;
p->pNext = q->pNext;
break;
}
}
if (q != NULL)
{
delete q;
q = NULL;//删除指针指向的对象后,应将指针归NULL,避免野指针的出现;
}
}
template <class T>
void myList<T>::printList()
{//顺序打印链表中的节点;
for (Node *p = pHead; p != NULL; p = p->pNext)
cout << p->data <<'\t';
cout << endl;
}
template <class T>
myList<T>::~myList()
{
Node *p;
//顺序删除结点;
while(pHead != NULL)
{
p = pHead;
pHead = pHead->pNext;
delete p;
}
p = NULL;
}
#endif
[code=C/C++][/code]
***********************************mySet.h****************************************************
#ifndef _MYSET_H_
#define _MYSET_H_
#include <iostream>
#include "myList.h"
template <class T>
class mySet: public myList<T>
{
public:
bool Contains(T &);
void add (T &);
};
template <class T>
bool mySet<T>::Contains(T &t)
{
//myList<T>::Node *p;
//myList<T>::Node *
//;myset<T>换成myList<T>也可以;
//for (mySet<T>::Node *p = mySet<T>::pHead;p != NULL ; p = p->pNext)
if ((p->data) == t)
return true;
return false;
}
template <class T>
void mySet<T>::add(T &t)
{
if (!Contains(t))
myList<T>::add(t);
}
#endif
[解决办法]
好长的代码啊,看看C++编程思想 下卷 第五章 深入模板编程
[解决办法]
代码太长,纯支持
[解决办法]
template <class T>
class myList
{
public:
typedef struct Node Node;
myList(); //构造函数 ;
void remove(T &); //删除一个元素;
void printList(); //打印链表;
virtual void add(T &); //添加一个元素;
virtual ~myList(); //析构函数;
protected:
struct Node //结点类型;
{
Node *pNext;
T data;
};
typename myList<T>::Node *p;
这样试试吧
[解决办法]
DEV-CPP也编译通过