在编写类模板的程序时,把类模板的成员函数的声明和实现分别写在了头文件和源文件中,导致了

出现编译出错的现象,现弄清楚了原因,特写此篇,供大家参考学习。

c++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,

编译器是无法知道模板类中使用模板类型的对象所占用的空间大小的。只有模板被真正使用的时候,

编译器才知道,模板套用的是什么类型,应该分配多少空间。这也是模板类称之为模板而不是泛型的原因。

既然是在编译的时候,根据套用的不同类型进行编译,那么,套用不同类型的模板类实际上就是两个不同的

类型,也就是说,vector<int>和vector<char>是两个不同的数据类型,他们共同的成员函数也不是一个

函数,只不过具有相似的功能。

因而模板类在套用不同类型之后,会被编译出不同代码。

所以模板类的实现,脱离具体的使用,是无法单独的编译的;也就是说把声明和实现分开的做法是不可取的,

必须把实现全部写在头文件里面。为了代码清晰,可以把实现写在类的外面。

下面是具体的代码实现:

以简单的冒泡排序为例写的类模板.h头文件如下:

template<class T>
class SortClass{
public://冒泡排序初级版:两两比较相邻记录的关键字void BubbleSort0(T data[], int n){for(int i=0;i<n;++i){for(int j=i+1;j<n;++j){if(data[i]>data[j]){swap(data[i],data[j]);}}}}
private:void swap(T &a, T &b){T temp;temp = a;a=b;b=temp;}
};

这种写法是把类模板的成员函数实现写在了类里。

还可以把类模板的成员函数实现写在类外。代码如下:

template<class T>
class SortClass{
public:void BubbleSort0(T data[], int n);
private:void swap(T &a, T &b){T temp;temp = a;a=b;b=temp;}
};//这个类模板的成员函数实现
template<class T>
void SortClass<T>::BubbleSort0(T data[], int n)
{for(int i=0;i<n;++i){for(int j=i+1;j<n;++j){if(data[i]>data[j]){swap(data[i],data[j]);}}}
}

下面是对类模板的成员函数的调用c++代码:

#include<iostream>
#include"sortImple.h"using namespace std;int main()
{SortClass<int> s;int a[10]={9,4,2,7,3,1,5,8,6,0};cout<<"排序前数组的元素值"<<endl;for(int i=0;i<10;++i)cout<<a[i]<<" ";cout<<endl;s.BubbleSort0(a,10);cout<<"排序后数组的元素值"<<endl;for(int i=0;i<10;++i)cout<<a[i]<<" ";cout<<endl;return 0;
}

程序输出如下:

c++类模板用法讲解相关推荐

  1. wxWidgets:wxScopedCharTypeBuffer< T >类模板用法

    wxWidgets:wxScopedCharTypeBuffer< T >类模板用法 wxWidgets:wxScopedCharTypeBuffer< T >类模板用法 用法 ...

  2. wxWidgets:wxPixelData< Image, PixelFormat >类模板用法

    wxWidgets:wxPixelData< Image, PixelFormat >类模板用法 wxWidgets:wxPixelData< Image, PixelFormat ...

  3. wxWidgets:wxObjectDataPtr< T >类模板用法

    wxWidgets:wxObjectDataPtr< T >类模板用法 wxWidgets:wxObjectDataPtr< T >类模板用法 用法详细说明 wxWidgets ...

  4. wxIntegerValidator< T > 类模板用法

    wxIntegerValidator< T > 类模板用法 wxIntegerValidator< T > 类模板用法 用法详细说明 wxIntegerValidator< ...

  5. wxWidgets:wxFloatingPointValidator<T> 类模板用法

    wxWidgets:wxFloatingPointValidator 类模板用法 wxWidgets:wxFloatingPointValidator 类模板用法 用法详细说明 wxWidgets:w ...

  6. wxWidgets:wxCustomBackgroundWindow<W> 类模板用法

    wxWidgets:wxCustomBackgroundWindow 类模板用法 wxWidgets:wxCustomBackgroundWindow 类模板用法 用法详细说明 wxWidgets:w ...

  7. PHP如何把三张图片均匀分布,C++ uniform_real_distribution连续均匀分布类模板用法详解...

    uniform_real_distribution 类模板定义了一个默认返回 double 型浮点值的连续分布.可以按如下方式生成一个返回值在范围 [0,10) 内的分布对象: std::unifor ...

  8. C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则

    类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...

  9. c++ 中pair类模板的用法详解

    pair: 头文件:#include<utility> 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类 ...

  10. wxWidgets:wxWeakRef< T >类模板的用法

    wxWidgets:wxWeakRef< T >类模板的用法 wxWidgets:wxWeakRef< T >类模板的用法 用法详细说明 wxWidgets:wxWeakRef ...

最新文章

  1. node项目部署到服务器报错,记一次部署node项目到centos服务器经历
  2. python函数能否增强代码可读性_python——初识函数
  3. arcgis 统一投影下范围不同_关于Arcgis这62个常用技巧,你造吗
  4. 同步与异步系列之二 导读目录
  5. 将本地Blog部署到GitHub上,有自己的博客页面!
  6. vector自动扩容如何实现_腾讯云ClickHouse如何实现自动化的数据均衡?
  7. 贝格数据携手清华大学“勘探”大数据富矿
  8. Tomcat的下载及环境变量配置
  9. CASS使用-20220617更新
  10. 谷歌图片的爬虫库(附加必应图片爬虫)--针对近期谷歌变了
  11. 计算机程序设计专业大学排名,全国计算机专业大学排名一览表
  12. mysql57免安装教程_mysql5.7免安装版配置教程
  13. sap 双ALV联动显示示例(备份)
  14. 下载kaggle比赛的数据集
  15. Jquery.city-picker 实现省市区三级联动
  16. Vue3定义全局变量/方法
  17. IMS-FACNN(Improved Multi-Scale Convolution Neural Network integrated with a Feature Attention Mecha
  18. 六种STM32开发板光盘资料免费下载
  19. 用unity和php实现一个排行榜功能(unity客户端篇)
  20. php 单选默认,html单选按钮默认选中怎么做?input标签的单选按钮用法实例

热门文章

  1. 工商银行销售基金一览表
  2. unit10-Cookie、Session
  3. centos7安装mysql5.7步骤(图解版)
  4. 苹果手机显示有4g上不了网络连接服务器,苹果移动数据为什么叫蜂窝网络_蜂窝移动数据和4g有什么区别...
  5. 魔兽世界编程宝典(4-1)
  6. windows 下 c++ 二维码生成库
  7. 杭州学车 富阳场口考场考试 经验分享
  8. 云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
  9. cmd命令查看计算机信息,cmd命令查看局域网内计算机信息
  10. 利用perl一键生成符合LEFse差异分析的Table表