写了个带运算符重载的友元函数的模板类,链接异常error LNK2019: 无法解析的外部符号

写了个带运算符重载的友元函数的模板类,链接错误error LNK2019: 无法解析的外部符号
-------------------------SqList.h---------------------------------
#ifndef SQLIST_H
#define SQLIST_H
#include "List.h"
template<typename Type>
class SqList:public List<Type>
{
Type *element;
int currentLength;
int maxLength;
public:
SqList(int =100);
SqList(Type *,int,int =100);
~SqList();
friend SqList<Type> &operator + (SqList<Type> &,SqList<Type> &);
};
#endif
-----------------------------SqList.cpp----------------------------------
#include "SqList.h"

template<typename Type>
SqList<Type>::SqList(int ml)
{
element=new Type[ml];
currentLength=0;
maxLength=ml;
}

template<typename Type>
SqList<Type>::SqList(Type *e,int cl,int ml)
{
currentLength=cl;
maxLength=ml;
element=new Type[ml];
for (int i=0;i<cl;i++)
{
element[i]=e[i];
}
}

template<typename Type>
SqList<Type>::~SqList()
{
delete[]element;
currentLength=0;
maxLength=0;
}

template<typename Type>
SqList<Type> &operator +(SqList<Type> & t1,SqList<Type> & t2)//将两个数组连成一个
{
int length=t1.currentLength+t2.currentLength;
Type *e=new Type[length];
for(int i=0;i<t1.currentLength;i++)
{
e[i]=t1.element[i];
}
for (int i=t1.currentLength;i<length;i++)
{
e[i]=t2.element[i-t1.currentLength];
}
return SqList(e,length);
}
-----------------------------Main.cpp-----------------------------------------
#include <iostream>
#include "SqList.h"
#include "SqList.cpp"
using namespace std;
int main()
{
int array[]={12,23,34,45,56,67,78,89};
SqList<int> si(array,8);
int array2[]={98,87,76,65,54,43,32,21};
SqList<int> si2(array2,8);
si=si+si2;
si.showList();
return 0;
}

在vs2010上运行,出现错误Main.obj : error LNK2019: 无法解析的外部符号 "class SqList<int> & __cdecl operator+(class SqList<int> &,class SqList<int> &)" (??H@YAAAV?$SqList@H@@AAV0@0@Z),该符号在函数 _main 中被引用
1>C:\Users\Eric\documents\visual studio 2010\Projects\线性表\Debug\线性表.exe : fatal error LNK1120: 1 个无法解析的外部命令
我已经把不相干的代码都省略掉了,List类里都是纯虚函数,而且也跟这些没相干,就没贴上来

恳请各位大神不吝赐教,帮我看看是哪里写得不对,感激不尽

------解决方案--------------------
探讨
引用:

cpp文件不能相互包含

那个是因为用了模板的关系,如果不把CPP文件也包含进去,就会出现链接错误。包含进去了,如果不写这个重载函数的话,就可以正确运行。

------解决方案--------------------
在你的#endif的前面包含你模版定义的.cpp文件,
C++perimer第4章的模版编程的最后面有讲编译模型的,
有两个编译模型,自己去复习一下