为什么vc++输入输出符重载用不了友元

songted 2004-11-24 10:33:26
本人一直都用borland, 前一阵子发现vc++无法用输出输入符重载, 后来发现原来是无法识别友元,程序如下:

template <class T>
class list{
public:
…………

friend ostream& operator<< (ostream& os, const list<T>& value){
for(node<T>* p=value.head->next; p!=NULL; p=p->next){
os<<p->data<<"->";
}
os<<"NULL";
return os;
}

protected:
node<T> *head;
};

在borland下可以调用输出符重载友元函数,但在vc++下却会报错,为什么呢??
...全文
76 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
somedummy 2004-11-26
  • 打赏
  • 举报
回复
首先,这个operator<<是一个模板,所以进行friend声明的时候需要加上template<typename T>,只有这样编译器才会正确的实例化一个函数实例,否则链接的时候将会找不到匹配的实例。

另外,Borland C++ Builder这样的做法不太恰当,这样的语法毕竟不是标准里面所规定支持的,这样给移植性带来了损害。
believe_me 2004-11-25
  • 打赏
  • 举报
回复
用友元函数在c++中需要用到
#include<iostream.h> 头文件


#include<iostream>
using namespace std;
的时候就不行
lizhenlz 2004-11-25
  • 打赏
  • 举报
回复
友元在外面申明.
somedummy 2004-11-25
  • 打赏
  • 举报
回复
这个友元模板的存在范围似乎界定不清,试试看用::修饰operator>>,这样将会把这个重在操作符的模板放到全局域里面去

对于模板这样的东西存在着很多语法上面的分歧,各个厂商的编译器之间可能会存在着差异。现在我手头没有比较切合标准的编译器,如果你不急的话,明天晚上我可以抽空帮你仔细调试一下代码

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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