返回信息流我重载了<<,其中 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------------------------
经常遇到无法解析的外部符号这种错误,导致这种错误都有哪些原因呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #48636同步于 2011/1/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于ostream<<重载的问题
xuheer
2011/1/6镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s)
有没加上<T>?
如果没加上<T>的话,则该友元函数会被解释为非模板函数。
如果不加的话,在类里定义该函数也行
【 在 Lindsey 的大作中提到: 】
: 检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s)
: 有没加上<T>?
: 如果没加上<T>的话,则该友元函数会被解释为非模板函数。
: ...................
我是在类中声明的友元函数……
#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;
}
方案一:
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;
}
方案二:
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;
}
};
【 在 Lindsey 的大作中提到: 】
: 方案二:
: template <class T>
: class SeqStack
: ...................
Thanks Lindsey,问题解决了。原来是模板类导致的问题,学习了~~~~~
【 在 king2008 的大作中提到: 】
: #include <iostream.h>
: //using namespace std;
: template <class T>
: ...................
king2008,这样编译不过的,见1楼的解释。
【 在 Lindsey 的大作中提到: 】
: 检查函数声明是否是friend ostream & operator <<<T> (ostream &os, SeqStack<T> &s)
: 有没加上<T>?
: 如果没加上<T>的话,则该友元函数会被解释为非模板函数。
: ...................
这个真的需要吗?