LINK2019无法解释的外部符号:类模板与重载<<运算符函数
在类模板中重载<<运算符的问题描述
类中声明<<运算符
template<class T>
class SeqList //顺序表类的定义
{
private:
T *element;
int length;
int maxSize;
public:
......
friend ostream& operator<<(ostream &out, const SeqList<T> &List); //输出线性表
};
重载<<运算符定义
template<class T>
ostream &operator<<(ostream &out, const SeqList<T> &List)
{
cout << "输出顺序表中的所有元素:" << endl;
for (int i = 0; i < List.length; i++)
{
out << List.element[i] << " ";
}
out << endl;
return out;
}
主函数调用<<运算符
int main()
{
cout << "hello word!" << endl;
SeqList<int> TestDemo(10);
for (int i = 0; i < 10; i++)
{
TestDemo.ListInsert(i +1, i);
}
cout << TestDemo;
return 0;
}
会出现以下报错
错误 LNK2019 无法解析的外部符号 “class std::basic_ostream<char,struct std::char_traits > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits > &,class SeqList const &)” (??6@YAAAV?
b
a
s
i
c
o
s
t
r
e
a
m
@
D
U
?
basic_ostream@DU?
basicostream@DU?char_traits@D@std@@@std@@AAV01@ABV?$SeqList@H@@@Z),该符号在函数 _main 中被引用 DataStructuresProject1 E:\台式机备份文件_20121212\李兴强_1\李兴强\DataStructures\DataStructuresProject1\DataStructuresProject1\testProject.obj 1
第一种解决办法
类中声明<<运算符添加"<>"如下所示
原声明为
friend ostream& operator<<(ostream &out, const SeqList<T> &List); //输出线性表
添加"<>"后变为
friend ostream& operator<< <>(ostream &out, const SeqList<T> &List); //输出线性表
即可解决问题
第二种解决方法
将重载<<运算符不作为类的友元函数,放在类的外面,重新写输出函数
void printList(SeqList<int> outList)
{
for (int i = 0; i < outList.Length(); i++)
{
cout << outList.getElement(i) << " ";
}
cout << endl;
}
经过上面两种方法即可把问题解决。