免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5538 | 回复: 11
打印 上一主题 下一主题

模板类错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 22:59 |只看该作者 |倒序浏览
#include <iostream>
#include"nodetype.h"
#if!defined LINKEDLIST_H
#define LINKEDLIST_H
//using namespace std;

template<class T>
class LinkedList
{
private:
        Node <T>* front;Node <T>* rear;
        Node <T>* current;Node <T>*prevptr;
        int size;
        int position;
        //生成新结点
        Node <T>* GetNode(const T & item,Node<T> *PtrNext);
        //释放结点
        void FreeNode(Node <T>* p);
public:
        LinkedList();//构造函数
//        LinkedList(const LinkedList & L);
//        ~LinkedList();//析构函数
        int ListedEmpty() const;
        //遍历链表的函数
        void Reset();
        void Next();//令当前结点指向原当前结点的后继节点
        int EndOfList() const;
        int ThisPosition() const;
        //插入一个data域值为item的结点
        void Insert(const T & item );//表头插入
        void InsertRear(const T & item);//表尾插入
        //删除函数
        int DeleteFront();//删除当初结点的前驱结点
        void DeleteAt();//删除当期结点
        //返回当前结点的data域值
        T Data() const;
        void fnext();//front指向下一个节点
        void ClearList();
        //创建链表
        void creatlink();
        void linkreverse();//将链表反向
        void linkprint();//打印链表
};
#endif
错误:
f:\程序设计b\链表\linktype\dadi\linktype.h(43) : error C2989: 'LinkedList' : template class has already been defined as a non-template class
我调了好多地方,可还是报错。大家帮帮找找错。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-04-17 23:03 |只看该作者
#include"nodetype.h"
这个文件中是什么内容?

论坛徽章:
0
3 [报告]
发表于 2009-04-17 23:25 |只看该作者

回复 #2 OwnWaterloo 的帖子

#include<iostream>
#if!defined NODE_H
#define NODE_H
template<class T>
class Node
{
friend class LinkedList;
private:
        Node <T> * next;
public:
        T data;
        Node(const T & item,Node <T>*ptrnext=NULL);
        void Insert(Node <T> * p);//在当前结点之后插入指针结点
        Node <T> * DeleteAfter();//删除后继并返回
        Node <T>* NextNode() const;
};
#endif

论坛徽章:
0
4 [报告]
发表于 2009-04-17 23:37 |只看该作者
friend class LinkedList;  ---》 friend class LinkedList<T>
试试

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-04-17 23:43 |只看该作者
前置声明一个模板:

template< class T >
class LinkedList;

template< class T >
class Node
{
friend class LinkedList< T >; // 再声明友元

// ...
};


还要注意的是, 头文件保护符。
对于这部分代码, 不算错, 因为保护符以外除了include 一些还有内部保护符的头文件没有做其他事。

但是, 有可能会忘记这点。  最好是

#ifndef GUARD
#defined GUARD

// ----   在保护符之后写内容

#include <iostream>

template< class T >
class LinkedList;

template< class T >
class Node
{
friend class LinkedList< T >; // 再声明友元

// ...
};


#endif

论坛徽章:
0
6 [报告]
发表于 2009-04-18 23:01 |只看该作者

回复 #5 OwnWaterloo 的帖子

我试了一下,可还是报同样的错误。不知为什么。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2009-04-19 01:05 |只看该作者
原帖由 火星人1 于 2009-4-18 23:01 发表
我试了一下,可还是报同样的错误。不知为什么。



------ nodetype.h ------
#if !defined NODE_H
#define NODE_H

#include<iostream>

template<class T>
class LinkedList;

template<class T>
class Node
{
friend class LinkedList<T>;
private:
        Node <T> * next;
public:
        T data;
        Node(const T & item,Node <T>*ptrnext=NULL);
        void Insert(Node <T> * p);//在当前结点之后插入指针结点
        Node <T> * DeleteAfter();//删除后继并返回
        Node <T>* NextNode() const;
};

#endif


------ linktype.h ------

#if !defined LINKEDLIST_H
#define LINKEDLIST_H

#include <iostream>

#include"nodetype.h"

//using namespace std;

template<class T>
class LinkedList
{
private:
        Node <T>* front;Node <T>* rear;
        Node <T>* current;Node <T>*prevptr;
        int size;
        int position;
        //生成新结点
        Node <T>* GetNode(const T & item,Node<T> *PtrNext);
        //释放结点
        void FreeNode(Node <T>* p);
public:
        LinkedList();//构造函数
//        LinkedList(const LinkedList & L);
//        ~LinkedList();//析构函数
        int ListedEmpty() const;
        //遍历链表的函数
        void Reset();
        void Next();//令当前结点指向原当前结点的后继节点
        int EndOfList() const;
        int ThisPosition() const;
        //插入一个data域值为item的结点
        void Insert(const T & item );//表头插入
        void InsertRear(const T & item);//表尾插入
        //删除函数
        int DeleteFront();//删除当初结点的前驱结点
        void DeleteAt();//删除当期结点
        //返回当前结点的data域值
        T Data() const;
        void fnext();//front指向下一个节点
        void ClearList();
        //创建链表
        void creatlink();
        void linkreverse();//将链表反向
        void linkprint();//打印链表
};

#endif



VC6、8、9
gcc3.4.x
都没错。。。。

论坛徽章:
0
8 [报告]
发表于 2009-04-19 09:39 |只看该作者

回复 #6 火星人1 的帖子

删掉编译好的obj文件,重新编译一次

论坛徽章:
0
9 [报告]
发表于 2009-04-19 09:52 |只看该作者

回复 #8 bbmmzz 的帖子

找不到obj文件,debug文件里也没有。都是些dsw,opt文件

论坛徽章:
0
10 [报告]
发表于 2009-04-19 09:56 |只看该作者

回复 #7 OwnWaterloo 的帖子

不知是否是我的VC的问题。我用下列主函数,还是编译不过去,报同样的错误。主函数:
#include <iostream>
#include "linktype.h"
using namespace std;

int main(){
        LinkedList <int> l;
        l.creatlink();
        l.linkprint();
        l.linkreverse();
        l.linkprint();
        return 0;
}
非常感激你的帮助,如果你有时间,在帮我看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP