简析C++模板
原文见:www.louhang.xin
模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。
模板分为模板函数和模板类。
通过模板我们可以增强代码的复用性。 减少无意义的重复工作,提高工作效率以及代码质量。
模板函数
模板函数的定义如下:
template <class 形参名1, class 形参名2, ···>
返回类型 函数名(参数列表)
{...}
模板形参的定义可以使用class,也可以使用typename,含义是相同的。
template<typename T>
bool IsEqual (const T& left , const T& right )
{
return left == right;
}
void test1 ()
{
string s1 ("s1"), s2("s2" );
cout<<IsEqual (s1, s2)<<endl ;
cout<<IsEqual (1,1)<<endl;
}
模板类
类模板的格式
template <class 形参名1, class 形参名2, ···>
class 类名
{ ... };
// 动态顺序表
template<class T>
class SeqList
{
public :
SeqList();
~ SeqList();
private :
int _size ;
int _capacity ;
T* _data ;
};
template<classs T> SeqList:: SeqList()
: _size(0)
, _capacity(10)
, _data(new T[ _capacity])
{}
template<classs T> SeqList::~ SeqList()
{
delete [] _data ;
}
void test1 ()
{
SeqListsl1;
SeqListsl2;
}
模板的分离编译
模板不支持分离编译,这是因为模板只有才实例化出对象的时候其代码才会出现在内存内部,才会含有意义。
而分离编译的话,由于程序是先编译,再链接。在编译的时候,没有对模板进行实例化,其不存在意义,因此在链接的时候,会找不到链接文件。程序报错。
详见下图分析:
针对不能分离编译的解决方法如下:
-
显示实例化模板,模板类的定义后面添加template class SeqList;
-
将模板的定义与声明放在同一文件之中。