博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ template 学习归纳2
阅读量:7277 次
发布时间:2019-06-29

本文共 3135 字,大约阅读时间需要 10 分钟。

关于c++中的类模板,常见的形式为:

template
class className{ //...};

比如笔者在这里举一个例子:

 

#include 
#include
#include
template
class stack{private: std::vector
elems;public: void push(T const&); void pop(); T top() const; bool empty() const{ return elems.empty(); }};template
void stack
::push(T const& a){ elems.push_back(a);}template
void stack
::pop(){ if(elems.empty()){ throw std::out_of_range("stack
::pop empty"); } return elems.pop_back();}template
T stack
::top()const{ if(elems.empty()){ throw std::out_of_range("stack
::top empty"); } return elems.back();}int main(){ return 0;}

从上面的代码可以看出,为了定义成员函数,我们使用了下面的形式,比如:

template
void stack
::push(T const& a){ elems.push_back(a);}

本来在此处有一个问题的,也就是关于类成员函数的实现位置的问题,这个问题我们稍后会提到。

现在我们为了测试上面的例子可以使用下面的函数代码:

int main(){	stack
intStack; intStack.push(1); intStack.push(2); std::cout<
<
strStack; strStack.push("hello"); std::cout<
<

我们有些时候会遇到这样的代码,比如:

stack
> intStack;

在这种情况下,我们要注意就是两个“>”中间的那个空格,那个是必须的,否则的话,编译器会认为是“>>”。这一点大家写代码的时候要注意。

下面我们来看看类模板的特化:

当我们想特化一个类模板的时候,我们就需要用template<>开头,后面更上我们希望特化的代码。比如:

template<>class myStack
{ //...};

对于特化类模板而言,就如同编写普通的类成员函数一样,比如:

void myStack
::pop(int const& a){ //...}

下面我们呢来看看类模板的局部特化。

例如对于下面的代码:

template
class myClass{ /...};

而言,以下几种像是的局部特化都是正确 的:

//局部特化 两个参数一致template
class myClass
{ //...};//局部特化 第二个为inttemplate
class myClass
{ //...};//两个参数都为指针类型template
class myClass
{ //...};

在下面的例子中:

myClass
mif; //将使用
myClass
mif; //将使用
myClass
mif; //将使用
myClass
mp; //将使用

大家要注意下面的错误代码,

myClass
m; myClass
m;

z这两个代码在上面的这个例子中都是错误的。前者因为会和myClass<T,T>产生二义性。后者会和myClass<T,T>产生二义性、使得编译器不知道应该匹配哪一个。

如果想解决上面的第二个二义性的话,我们可以专门特化下面的代码:

template
class myClass
{ //...};

接下来我们来看看预设模板参数:

我们先来看看代码再说,大家注意和上面的例子进行比较:

#include 
#include
#include
#include
#include
template
>class stack{private: CONT elems;public: void push(T const&); void pop(); T top() const; bool empty() const{ return elems.empty(); }};template
void stack
::push(T const& a){ elems.push_back(a);}template
void stack
::pop(){ if(elems.empty()){ throw std::out_of_range("stack
::pop empty"); } return elems.pop_back();}template
T stack
::top()const{ if(elems.empty()){ throw std::out_of_range("stack
::top empty"); } return elems.back();}int main(){ try{ stack
intStack; stack
> douStack; //注意,这里千万不能写下面的这一行代码: // stack
> douStack; intStack.push(1); std::cout<
<

我们使用

stack
> douStack;

来声明了一个double stack,他的内部使用的是std:Open-mouthed smileeque<>来管理。

转载地址:http://vjscm.baihongyu.com/

你可能感兴趣的文章
追梦路上
查看>>
Centos7 gvim sougou搜狗输入法无法切换
查看>>
邻接表链式结构的实现和顺序结构的实现
查看>>
meta标签详解:源http://blog.csdn.net/kongjiea/article/details/17092413
查看>>
内存泄露&内存溢出
查看>>
屏蔽webvie嵌套页广告
查看>>
Dynamics CRM 报表导出EXCEL 列合并问题的解决方法
查看>>
MTK6573的LDO控制
查看>>
【工具】-RAP接口管理工具
查看>>
***单文件搞定微信支付和支付宝支付
查看>>
Adminimize 插件:WordPress根据用户角色显示/隐藏某些后台功能
查看>>
运维老鸟教你安装centos6.5如何选择安装包
查看>>
oracle的nvl和sql server的isnull
查看>>
Entity Framework Code-First(13):Configure Many-to-Many
查看>>
Hash的应用
查看>>
如何解决缺少OCX问题,如何在win7 64位下注册OCX
查看>>
《程序员代码面试指南》第五章 字符串问题 将整数字符串转成整数值
查看>>
python模拟登录人人网
查看>>
SSM整合过程中出现的问题
查看>>
第四十三天
查看>>