BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #48636同步于 2011/1/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于ostream<<重载的问题

xuheer
2011/1/6镜像同步12 回复
我重载了<<,其中 SeqStack<T>是自己写的一个顺序栈模板类,在该类中声明<<为友元函数。程序在链接的时候出现问题。代码和错误如下,请大家帮忙分析一下是什么原因。 -------------------------------------重载函数------------------- template <class T> ostream & operator << (ostream &os, SeqStack<T> &s) { for(int i = s.top ; i >= 0; --i ) os<<s.element[i]<<" "; return os; } ----------------------------------------调用------------------------ cout<<a;//a为 SeqStack<int>的一个实例 ----------------------------------------错误提示------------------ error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class SeqStack<int> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$SeqStack@H@@@Z),该符号在函数 _main 中被引用 ------------------------------------------end------------------------ 经常遇到无法解析的外部符号这种错误,导致这种错误都有哪些原因呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Lindsey机器人#1 · 2011/1/6
检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s) 有没加上<T>? 如果没加上<T>的话,则该友元函数会被解释为非模板函数。 如果不加的话,在类里定义该函数也行
xuheer机器人#2 · 2011/1/6
【 在 Lindsey 的大作中提到: 】 : 检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s) : 有没加上<T>? : 如果没加上<T>的话,则该友元函数会被解释为非模板函数。 : ................... 我是在类中声明的友元函数……
Lindsey机器人#3 · 2011/1/6
我是说在类中“定义”函数,,,,,,,声明,定义,,,
king2008机器人#4 · 2011/1/7
#include <iostream.h> //using namespace std; template <class T> class SeqStack { T element; public: SeqStack(T e=T()){element = e;} friend ostream & operator << (ostream &os, SeqStack<T> &s) ; }; template <class T> ostream & operator << (ostream &os, SeqStack<T> &s) { os<<s.element<<" "; return os; }
Lindsey机器人#5 · 2011/1/7
方案一: template <class T> class SeqStack { T element; public: SeqStack(T e=T()){element = e;} friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s) ; }; template <class T> ostream & operator << (ostream &os, SeqStack<T> &s) { os<<s.element<<" "; return os; }
Lindsey机器人#6 · 2011/1/7
方案二: template <class T> class SeqStack { T element; public: SeqStack(T e=T()){element = e;} friend ostream & operator << (ostream &os, SeqStack<T> &s) { os<<s.element<<" "; return os; } };
xuheer机器人#7 · 2011/1/7
【 在 Lindsey 的大作中提到: 】 : 方案二: : template <class T> : class SeqStack : ................... Thanks Lindsey,问题解决了。原来是模板类导致的问题,学习了~~~~~
xuheer机器人#8 · 2011/1/7
【 在 king2008 的大作中提到: 】 : #include <iostream.h> : //using namespace std; : template <class T> : ................... king2008,这样编译不过的,见1楼的解释。
bupteinstein机器人#9 · 2011/1/10
【 在 Lindsey 的大作中提到: 】 : 检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s) : 有没加上<T>? : 如果没加上<T>的话,则该友元函数会被解释为非模板函数。 : ................... 这个真的需要吗?