简析C++模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Zhang_1218/article/details/78701021

简析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;
}

image.png


 模板类

类模板的格式 

template <class  形参名1, class 形参名2, ···>

class 类名 

{ ... };

// 动态顺序表
templateclass SeqList
{
public :
    SeqList();
    ~ SeqList();

private :
    int _size ;
    int _capacity ;
    T* _data ;
};


templateSeqList:: SeqList()
    : _size(0)
    , _capacity(10)
    , _data(new T[ _capacity])
{}

templateSeqList::~ SeqList()
{
    delete [] _data ;
}


void test1 ()
{
    SeqListsl1;
    SeqListsl2;
}

image.png


模板的分离编译

模板不支持分离编译,这是因为模板只有才实例化出对象的时候其代码才会出现在内存内部,才会含有意义。

而分离编译的话,由于程序是先编译,再链接。在编译的时候,没有对模板进行实例化,其不存在意义,因此在链接的时候,会找不到链接文件。程序报错。

详见下图分析:

image.png

针对不能分离编译的解决方法如下:

  1. 显示实例化模板,模板类的定义后面添加template class SeqList;

  2. ​将模板的定义与声明放在同一文件之中。



猜你喜欢

转载自blog.csdn.net/Zhang_1218/article/details/78701021
今日推荐