关于模板和友元的简单问题,在线等

triLine 2004-05-07 03:34:22
VC++中类模板的声明和其中的函数定义必须放在同一个头文件中.
现在有两个类模板,我都把它们放在一个头文件中,并声明其中的一个类是另一个类的友元. 但是编译没有通过,程序如下, 还请各位指点,问题解决就给分.
#include <iostream.h>
#include "OutOfBounds.h"
template <class T>
class Chain<T>; // 前向引用不知写法是否正确????
template <class T>
class ChainNode {
friend Chain<T>;
private:
T data;
ChainNode<T> *link;
};

template<class T>
class Chain {
public:
Chain() {first = 0;}
~Chain();
bool isEmpty() const {return first == 0;}
int length() const;
bool find(int k, T& x) const;
int search(const T& x) const;
Chain<T>& del(int k, T& x);
Chain<T>& insert(int k, const T& x);
void output(ostream& out) const;
private:
ChainNode<T> *first; // 指向第一个节点的指针
};

template<class T>
Chain<T>::~Chain(){ // 链表的析构函数,用于删除链表中的所有节点
ChainNode<T> *next; // 下一个节点
while (first) {
next = first->link;
delete first;
first = next;
}
}

template<class T>
int Chain<T>::length() const { // 返回链表中的元素总数
ChainNode<T> *current = first;
int len = 0;
while (current) {
len++;
current = current->link;
}
return len;
}

template<class T>
bool Chain<T>::find(int k, T& x) const { // 寻找链表中的第k 个元素,并将其传送至x
//如果不存在第k 个元素,则返回false,否则返回true
if (k < 1) return false;
ChainNode<T> *current = first;
int index = 1; // current 的索引
while (index < k && current) {
current = current->link;
index++;
}
if (current) {x = current->data; return true;}
return false; // 不存在第k 个元素
}

template<class T>
int Chain<T>::search(const T& x) const{
// 寻找x ,如果发现x ,则返回x 的地址
// 如果x 不在链表中,则返回0
ChainNode<T> *current = first;
int index = 1; // current 的索引
while (current && current->data != x) {
current = current->link;
index++;
}
if (current) return index;
return 0;
}

template<class T>
void Chain<T>::output(ostream& out) const{
// 将链表元素送至输出流
ChainNode<T> *current;
for (current = first; current; current = current->link)
out << current->data << " ";
}

template <class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{x.output(out); return out;}

template<class T>
Chain<T>& Chain<T>::del(int k, T& x){
// 把第k 个元素取至x ,然后从链表中删除第k 个元素
// 如果不存在第k 个元素,则引发异常OutOfBounds
if (k < 1 || !first)
throw OutOfBounds(); // 不存在第k 个元素
// p 最终将指向第k 个节点
ChainNode<T> *p = first;
// 将p 移动至第k 个元素,并从链表中删除该元素
if (k == 1) // p 已经指向第k 个元素
first = first->link; // 删除之
else { // 用q 指向第k - 1 个元素
ChainNode<T> *q = first;
for (int index = 1; index < k - 1 && q; index++)
q = q->link;
if (!q || !q->link)
throw OutOfBounds(); //不存在第k 个元素
p = q->link; // 存在第k 个元素
q->link = p->link;
} // 从链表中删除该元素
//保存第k 个元素并释放节点p
x = p->data;
delete p;
return *this;
}

template<class T>
Chain<T>& Chain<T>::insert(int k, const T& x){
// 在第k 个元素之后插入x
// 如果不存在第k 个元素,则引发异常OutOfBounds
// 如果没有足够的空间,则传递NoMem异常
if (k < 0) throw OutOfBounds();
// p 最终将指向第k 个节点
ChainNode<T> *p = first;
// 将p 移动至第k 个元素
for (int index = 1; index < k && p; index++)
p = p->getLink();
if (k > 0 && !p) throw OutOfBounds(); //不存在第k 个元素
// 插入
ChainNode<T> *y=new ChainNode<T>;
y->getData() = x;
if (k) { // 在p 之后插入
y->getLink() = p->getLink();
p->getLink() = y;
}
else { // 作为第一个元素插入
y->getLink() = first;
first = y;
}
return *this;
}


...全文
38 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
triLine 2004-05-08
  • 打赏
  • 举报
回复
问题已经解决,谢谢楼上.发分
hab1980 2004-05-08
  • 打赏
  • 举报
回复
你把程序的开头改一下看看:
template <class T>
class Chain<T>; // 前向引用不知写法是否正确????
这里把你的前向引用改成:
template <class T>
class Chain;

// That's OK?
  • 打赏
  • 举报
回复
你用的是vc6.0吗?

vc6.0中,用到友员函数的时候,好像要提前类声明。

class A; //提前类声明
class A
{
friend function(A & a);
.......
}

不知道说得对不对?
subtop 2004-05-07
  • 打赏
  • 举报
回复
不是这种格式,就很容易出错:)
subtop 2004-05-07
  • 打赏
  • 举报
回复
向前引用:
template<class T> class Chain;

友元类声明:
friend class Chain<T>;
triLine 2004-05-07
  • 打赏
  • 举报
回复
如果把ChainNode这个模板类写在另外一个头文件中,编译时提示找不到这个作为友元的类模板.

所以我把两个类写到了同一个头文件中.这时遇到的问题可能是前向引用问题,也就是程序第三行

和第四行的声明Chain<>这个类模板时候出的问题.

不知该如何解决!
triLine 2004-05-07
  • 打赏
  • 举报
回复
我自己UP一下,希望各位给点建议.
triLine 2004-05-07
  • 打赏
  • 举报
回复
编译提示:
Compiling...
Chain.cpp
d:\thesis\exp\moban\chain.h(14) : error C2143: syntax error : missing ';' before '<'
d:\thesis\exp\moban\chain.h(14) : error C2143: syntax error : missing ';' before '<'
main.cpp
d:\thesis\exp\moban\chain.h(14) : error C2143: syntax error : missing ';' before '<'
d:\thesis\exp\moban\chain.h(14) : error C2143: syntax error : missing ';' before '<'
Error executing cl.exe.
面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧