c++学习笔记之成员模板
来源:互联网 发布:键盘windows键解锁 编辑:程序博客网 时间:2024/06/05 11:09
任意类(模板或者是飞模板)可以拥有类模板或函数模板的成员,这种成员成为成员模板,成员模板不能为虚。成员模板的一个例子是标准容器的assign成员,接受两个迭代器的assign版本使用模板形参表示其迭代器形参的类型。另一个例子就是接受两个迭代器的容器构造函数。
1 定义成员模板
模板成员声明看起来像任意模板的声明一样。
在类模板作用域外部定义成员模板的时候,那必须包含两个模板形参表:
当成员模板时类模板的成员时,它的定义必须包含类模板形参以及自己的模板形参。
首先是类模板形参表,后面接着是自己模板形参表。
assign函数定义的开头为:
template <class Type> template <class Iter>
第一个模板形参表template <class Type>为类模板的,第二个模板形参表template <class Iter>是成员模板的。
3 成员模板的实例化
成员模板只有在程序使用时才实例化。类模板的成员模板的实例化要比类模板的普通成员函数的实例化要复杂一些。
成员模板有两种模板形参:(1)由类定义的(2)由成员模板本身定义的
类模板形参由调用函数的对象的类型确定,成员定义的模板形参的行为与普通函数模板一样。这些形参都通过常规模版实参推断确定。
因为所构造的是Queue<int>类型的对象,我怕们知道编译器将为Queue<int>实例化基于迭代器构造函数。该构造函数本身模版形参的类型由编译器根据a和a+4的类型推断,而该类型为short指针。因此,qi的定义实例化:
void Queue<int>::Queue(short *,short *);
对assign的调用将实例化qi的成员。qi具有Queue<int>类型,因此,这个调用将实例化名为assign的Queue<int>成员。该函数为函数模版,想起他任意的函数模版一样,编译器从传给调用者的实参推断assign的模版实参,推断得到的类型是vector<int>::iterator,这个调用实例化:
void Queue<int>::assign(vector<int>::iterator,vector<int>::iterator);
1 定义成员模板
模板成员声明看起来像任意模板的声明一样。
template <class Type> class Queue{ public: template <class It>Queue(It beg,It end){ copy_elems(beg,end); } template <class Iter> void assign(Iter,Iter); private: template <class Iter> void copy_elems(Iter,Iter);};template <class Type> template <class Iter>void Queue<Type>::assign(Iter beg,Iter end){ //destroy(); copy_elems(beg,end);}template <class Type> template <class Iter>void Queue<Type>::copy_elems(Iter beg,Iter end){ while(beg != end){ push(*beg); ++beg; }}成员声明的开头是自己的模板形参表。构造函数和assign函数各有一个模板类型形参,这些函数使用这些类型形参作为其函数形参的类型,他们函数
形参指明要复制元素范围的迭代器。
在类模板作用域外部定义成员模板的时候,那必须包含两个模板形参表:
template <class Type> template <class Iter>void Queue<Type>::assign(Iter beg,Iter end){ //destroy(); copy_elems(beg,end);}
当成员模板时类模板的成员时,它的定义必须包含类模板形参以及自己的模板形参。
首先是类模板形参表,后面接着是自己模板形参表。
assign函数定义的开头为:
template <class Type> template <class Iter>
第一个模板形参表template <class Type>为类模板的,第二个模板形参表template <class Iter>是成员模板的。
3 成员模板的实例化
成员模板只有在程序使用时才实例化。类模板的成员模板的实例化要比类模板的普通成员函数的实例化要复杂一些。
成员模板有两种模板形参:(1)由类定义的(2)由成员模板本身定义的
类模板形参由调用函数的对象的类型确定,成员定义的模板形参的行为与普通函数模板一样。这些形参都通过常规模版实参推断确定。
short a[4] = {0,3,6,9}; Queue<int> qi(a,a+4); vector<int> vi(a,a+4); qi.assign(vi.begin(),vi.end());
因为所构造的是Queue<int>类型的对象,我怕们知道编译器将为Queue<int>实例化基于迭代器构造函数。该构造函数本身模版形参的类型由编译器根据a和a+4的类型推断,而该类型为short指针。因此,qi的定义实例化:
void Queue<int>::Queue(short *,short *);
对assign的调用将实例化qi的成员。qi具有Queue<int>类型,因此,这个调用将实例化名为assign的Queue<int>成员。该函数为函数模版,想起他任意的函数模版一样,编译器从传给调用者的实参推断assign的模版实参,推断得到的类型是vector<int>::iterator,这个调用实例化:
void Queue<int>::assign(vector<int>::iterator,vector<int>::iterator);
0 0
- c++学习笔记之成员模板
- member template成员模板笔记----C++学习之路
- C++Template学习笔记之函数模板
- 我的小小学习笔记(7)之C++------模板之模板函数
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- C++静态成员学习笔记
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C/C++学习之模板
- C++学习笔记之模板
- Vijava 学习笔记之模板
- C++学习笔记之:模板
- 有序链表插入与删除——C语言
- 黑马程序员 类的加载、连接、初始化
- 2-SAT暴力dfs模板解释|不看你会后悔的
- 两个栈实现一个队列
- 共享服务器模式(shared server)和专用服务器模式(dedicated server)
- c++学习笔记之成员模板
- Toast用法
- 为什么可以不创建对象就调用类的成员函数?
- 微信公众帐号开发教程第7篇-文本消息中换行符的使用
- eclipse内部启动tomcat,外部浏览器无法打开127.0.0.1:8080的原因和解决办法
- MyBatils学习四删除数据
- More is better 1856
- 树状数组 LA 4329 亚洲赛北京赛区题
- Hadoop Pipes编程之C++实现WordCount