当前位置: 首页 > news >正文

宁城网站建设百度风云榜游戏

宁城网站建设,百度风云榜游戏,网站建设加盟,牡丹江市建设局网站目录 一、模板使用时的一个小注意点二、非类型模板参数三、类模板的特化3.1函数模板的特化3.2类模板的特化3.2.1全特化3.2.2偏特化 四、模板的分离编译4.1模板不支持分离编译4.2模板分离编译报错的分析4.2解决方案 五、模板的总结 一、模板使用时的一个小注意点 在使用模板时&…

目录

  • 一、模板使用时的一个小注意点
  • 二、非类型模板参数
  • 三、类模板的特化
    • 3.1函数模板的特化
    • 3.2类模板的特化
      • 3.2.1全特化
      • 3.2.2偏特化
  • 四、模板的分离编译
    • 4.1模板不支持分离编译
    • 4.2模板分离编译报错的分析
    • 4.2解决方案
  • 五、模板的总结

一、模板使用时的一个小注意点

在使用模板时,在有些场景下需要加上typename来告诉编译器这里是类型,否则会编译不通过。如:我想写一个不只是针对vector类型打印数据该怎么改写上面的代码呢?

#include<iostream>
using namespace std;#include<vector>void Print(const vector<int>& v)
{vector<int>::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";}cout<<endl;
}
int main()
{vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);Print(v);return 0;
}

首先对于泛型编程的思想一般都会考虑到用模板,所以一般我们都会这么改写代码。如:

#include<iostream>
using namespace std;#include<vector>
template<class Container>
void Print(const Container& v)
{Container::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout<<endl;
}
int main()
{vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);Print(v);return 0;
}

但是呢这种代码连编译都通过不了。如:
在这里插入图片描述
为什呢?
其实是编译器不知道Container::const_iterator这个是类型还是对象
需要在前面加上typename告诉编译器这个是类型,等模板实例化后再去找。如:
在这里插入图片描述

二、非类型模板参数

假设有这样一个场景,我需要创建2个静态的顺序表。一个顺序表的容量是10个,另一个是1000个,该怎么玩呢?按照常规的方法肯定是玩不了的,这时就需要非类型模板参数了。可以这么玩。如:

namespace Ting
{template<class T,size_t N>class vector{private:T _arr[N];size_t capapcity;};
}int main()
{Ting::vector<int, 10> v1;Ting::vector<int, 1000> v2;return 0;
}

在这里插入图片描述
注意:

  1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
  2. 非类型的模板参数必须在编译期就能确认结果且不能被修改。

三、类模板的特化

3.1函数模板的特化

直接先看代码,见一见猪跑。

//函数模板的特化
template<class T>
bool Less(T x, T y)
{return x < y;
}//对函数模板进行特化
template<>
bool Less<int*>(int* x, int* y)
{return *x < *y;
}
int main()
{int a = 2, b = 1;cout << Less(&a, &b) << endl;return 0;
}

乍一看是不是感觉函数模板特化有点与函数重载类似?感觉这个没啥用,但是这个是错觉。如:

//函数模板的特化
template<class T>
bool Less(T x, T y)
{return x < y;
}//对函数模板进行特化
template<class T>
bool Less(T* x, T* y)
{return *x < *y;
}
int main()
{int a = 2, b = 1;double c = 2.1, d = 2.2;cout << Less(&a, &b) << endl;cout << Less(&c, &d) << endl;return 0;
}

这种写法比函数重载要方便多了。
函数模板的特化步骤:

  1. 必须要先有一个基础的函数模板
  2. 关键字template后面接一对空的尖括号<>
  3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
  4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

3.2类模板的特化

类模板的特化的步骤:
1.必须要有基础的类模板
2.关键字template后面接一对空的尖括号<>
3.类名后跟一对尖括号<>,尖括号中指定需要特化的类型。
类模板的特化分为:全特化和偏特化

3.2.1全特化

全特化即是将模板参数列表中所有的参数都确定化。

//函数模板的全特化
template<class T1,class T2>
class Ting
{
public:Ting(){cout << "Ting<T1,T2>" << endl;}
};
template<>
class Ting<int,char>
{
public:Ting(){cout << "Ting<int,char>" << endl;}
};
template<>
class Ting<double, char>
{
public:Ting(){cout << "Ting<double,char>" << endl;}
};int main()
{Ting<int, float> zft01;Ting<double, char> zft02;Ting<int, char> zft03;Ting<float, int> zft04;return 0;
}

3.2.2偏特化

//函数模板的偏特化
template<class T1, class T2>
class Ting
{
public:Ting(){cout << "Ting<T1,T2>" << endl;}
};template<class T1>
class Ting<T1,int>
{
public:Ting(){cout << "Ting<T1,int>" << endl;}
};template<class T1>
class Ting<T1, double>
{
public:Ting(){cout << "Ting<T1,double>" << endl;}
};//还可以对某种类型参数做进一步限制 如:
template<class T1,class T2>
class Ting<T1*,T2*>
{
public:Ting(){cout << "Ting<T1*,T2*>" << endl;}
};template<class T1, class T2>
class Ting<T1&, T2&>
{
public:Ting(){cout << "Ting<T1&,T2&>" << endl;}
};int main()
{return 0;
}

四、模板的分离编译

4.1模板不支持分离编译

比如有这样一个Add函数。如:
.h文件

#pragma once
template<class T>
T Add(T x, T y);

.cpp文件

#include"Add.h"template<class T>
T Add(T x, T y)
{return x + y;
}

测试文件

//模板的分离编译
#include"Add.h"
int main()
{cout << Add(1, 2) << endl;return 0;
}

运行时就会出现这样的报错。如:在这里插入图片描述

4.2模板分离编译报错的分析

为什么会这样呢?
分析:
C/C++程序要运行,一般要经历一下步骤:
预处理—>编译—>汇编—>链接

编译:对程序按照语言特性进行词法、语法、语义分析,错误检查无误后生成汇编代码。注意头文件不参与编译,编译器对工程中的多个源文件是分离开单独编译的。
链接:将多个obj文件合成一个,并处理没有解决的地址问题。
在这里插入图片描述

4.2解决方案

第一种方法:显示实例化
.cpp文件

#include"Add.h"template<class T>
T Add(T x, T y)
{return x + y;
}//显示实例化
template
int Add(int x,int y);
int Add(double x, double y);

(以上的方法不推荐)
第二种方法:将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的。推荐使用这种。

五、模板的总结

【优点】

  1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
  2. 增强了代码的灵活性
    【缺陷】
  3. 模板会导致代码膨胀问题,也会导致编译时间变长
  4. 出现模板编译错误时,错误信息非常凌乱,不易定位错误
http://www.hkea.cn/news/203235/

相关文章:

  • 贷款类网站怎样做网络营销的推广
  • 乐清做网站哪家好税收大数据
  • 校园网站建设需求天津放心站内优化seo
  • 哈尔滨微网站建设热搜在哪里可以看
  • 网站用oracle做数据库福州seo推广服务
  • 康保县城乡建设委员会网站营销型网站重要特点是
  • 手机做网站的步骤跨境电商有哪些平台
  • 请人做网站要多少网络事件营销
  • 网站页脚有什么作用厦门seo哪家强
  • 东莞百度提升优化优化推广网站推荐
  • 查企业网站有哪些站长统计app软件
  • 做a高清视频在线观看网站济源新站seo关键词排名推广
  • 刚做的网站怎么搜索不出来百度seo收录软件
  • 视频拍摄app站长工具seo综合查询广告
  • 新闻单位建设网站的意义武汉seo推广优化
  • 低价网站公司软文怎么写
  • 东莞市建设公共交易中心网站百度官网首页
  • 如何建立的网站能争钱优化营商环境 助推高质量发展
  • 做百度网站营销型网站建设排名
  • 网站域名被黑国际新闻最新消息战争
  • 苏州网站开发公司济南兴田德润厉害吗网络自动推广软件
  • 广药网站建设试卷株洲最新今日头条
  • 网站建设管理考核办法微信推广平台怎么做
  • 网站新闻模块代码网络推广有哪些常见的推广方法
  • 合肥大型网站如何推广普通话
  • 高端网站制作软件怎么样推广自己的店铺和产品
  • 无障碍浏览网站怎么做关键词seo排名优化推荐
  • wordpress 247seo推广系统
  • 做深圳门户网站起什么名字好泰州seo外包公司
  • 网站视频上传怎么做百度站长平台论坛