关于友元函数的问题

weixiaofeng_00 2010-04-24 12:27:28
template <class T>
class Array1D {
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
friend istream &operator>>(istream &in, Array1D<T> &r);
friend ostream &operator<<(ostream &out, const Array1D<T> &r);
private:
int size;
T *elements; //指向T类型数组的指
};

这是一维数组类的实现。
这个类定义中,friend istream &operator>>(istream &in, Array1D<T> &r);
friend ostream &operator<<(ostream &out, const Array1D<T> &r);有什么错误?为什么用友元函数会出错。
请教高手,谢谢!

...全文
136 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
pengzhixi 2010-07-27
  • 打赏
  • 举报
回复
vc6.0对模板和友元支持都相当差劲
weixiaofeng_00 2010-07-27
  • 打赏
  • 举报
回复
不好意思,现在才结贴~虽然我想问的没有完全解决,但还是感谢热心回帖的大虾们~
耍宝王 2010-04-24
  • 打赏
  • 举报
回复
方法一:绑定友元函数模板

template <class T> class Array1D;//类的前向声明
template <class T> istream &operator>>(istream &in, Array1D<T> &r);//函数模板声明
template <class T> ostream &operator<<(ostream &out, const Array1D<T> &r);

template <class T>
class Array1D
{
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
friend istream &operator>> <T>(istream &in, Array1D &r);//注意那个<T>,参数中Array1D可以不带<T>
friend ostream &operator<< <T>(ostream &out, const Array1D &r);
private:
int size;
T *elements; //指向T类型数组的指
};

template <class T>
istream &operator>>(istream &in, Array1D<T> &r)
{
...
}

template <class T>
ostream &operator<<(ostream &out, const Array1D<T> &r)
{
...
}

方法二:在类内部直接定义
template <class T>
class Array1D
{
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
friend istream &operator>>(istream &in, Array1D<T> &r)//此时,默认为内联函数
{
...
}

friend ostream &operator<<(ostream &out, const Array1D<T> &r)
{
...
}
private:
int size;
T *elements; //指向T类型数组的指
};

方法三:类内部直接声明友元函数模板,即,非绑定友元函数模板
template <class T>
class Array1D
{
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
template <class Type> friend istream &operator>>(istream &in, Array1D<Type> &r);
template <class Type> friend ostream &operator<<(ostream &out, const Array1D<Type> &r);
private:
int size;
T *elements; //指向T类型数组的指
};
template <class Type>
istream &operator>>(istream &in, Array1D<Type> &r)
{
...
}

template <class Type>
ostream &operator<<(ostream &out, const Array1D<Type> &r)
{
...
}

方法四:LZ你的方法
template <class T>
class Array1D
{
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
friend istream &operator>>(istream &in, Array1D<T> &r);
friend ostream &operator<<(ostream &out, const Array1D<T> &r);
private:
int size;
T *elements; //指向T类型数组的指
};

//根据实例直接定义函数实体,比如使用Array1D<int>的对象
//这是普通函数,应此不需要template <class T>
istream &operator>>(istream &in, Array1D<int> &r)//如要用Array1D<char>的对象需要另行定义一个函数
{
...
}
ostream &operator<<(ostream &out, const Array1D<int> &r)
{
...
}

LZ请参考http://blog.csdn.net/peimichael/archive/2009/11/28/4894000.aspx
aweer 2010-04-24
  • 打赏
  • 举报
回复
template<class T>
friend ostream& operator<<(ostream&,const Array1D<T> &r);
template<class T>
friend istream &operator>>(istream &in, Array1D<T> &r);
template <class T>
class Array1D {
public:
Array1D(int sz=0);
~Array1D() { delete [] elements; }
T& operator [] (int i) const; //重载[],取元素值
Array1D<T>&operator =(const Array1D<T> &r); //整体赋值
friend istream &operator>> <T>(istream &in, Array1D<T> &r);
friend ostream &operator<< <T>(ostream &out, const Array1D<T> &r);
private:
int size;
T *elements; //指向T类型数组的指
};
aweer 2010-04-24
  • 打赏
  • 举报
回复
模板的友元函数要前置声明
勇敢的搬砖人 2010-04-24
  • 打赏
  • 举报
回复
路过接分
pengzhixi 2010-04-24
  • 打赏
  • 举报
回复
如果是vc6.0 还真不好说,如果不是就改成3L的试试,另外模板不要分离编译。
Markerhao 2010-04-24
  • 打赏
  • 举报
回复
学习了,基础还不行....
weixiaofeng_00 2010-04-24
  • 打赏
  • 举报
回复
我用的是Dev-C++编译器,用了二三楼的方法,解决了。非常感谢,辛苦了!!
但是我又遇到五楼所说的问题了:
因为之前改了很多遍,我就换到VC++6.0,但是为什么在Dev中通过的在VC就报错呢?
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2010-04-24 12:27
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下