设为首页 加入收藏

TOP

C++模板Template(二)
2019-09-03 02:42:17 】 浏览:143
Tags:模板 Template
(); 8 }; 9 10 #endif
复制代码

  TemplateDemo.cpp

复制代码
 1 #include<iostream.h>
 2 #include "TemplateDemo.h"
 3 
 4 template<class T> A<T>::A(){}
 5 
 6 template<class T> T A<T>::g(T a,T b){
 7     return a+b;
 8 }
 9 
10 void main(){
11     A<int> a;
12     cout<<a.g(2,3.2)<<endl;
13 }
复制代码

  编译结果:

复制代码
1 --------------------Configuration: TemplateDemo - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo.cpp
4 G:\C++\CDaima\TemplateDemo\TemplateDemo.cpp(12) : warning C4244: 'argument' : conversion from 'const double' to 'int', possible loss of data
5 
6 TemplateDemo.obj - 0 error(s), 1 warning(s)
复制代码

  运行结果:      5  

  我们从上面的测试示例中可以看出,并非作者原作中的那么严密!此处仅是本人跟人测试结果!请大家本着实事求是的态度,自行验证!

 

  2、非类型形参

    2.1 、非类型模板形参:模板的非类型形参也就是内置类型形参,如template<class T, int a> class B{};其中int a就是非类型的模板形参。

    2.2、 非类型形参在模板定义的内部是常量值,也就是说非类型形参在模板的内部是常量。

    2.3、 非类型模板的形参只能是整型,指针和引用,像double,String, String **这样的类型是不允许的。但是double &,double *,对象的引用或指针是正确的。

    2.4、 调用非类型模板形参的实参必须是一个常量表达式,即他必须能在编译时计算出结果。

    2.5 、注意:任何局部对象,局部变量,局部对象的地址,局部变量的地址都不是一个常量表达式,都不能用作非类型模板形参的实参。全局指针类型,全局变量,全局对象也不是一个常量表达式,不能用作非类型模板形参的实参。

    2.6、 全局变量的地址或引用,全局对象的地址或引用const类型变量是常量表达式,可以用作非类型模板形参的实参

    2.7 、sizeof表达式的结果是一个常量表达式,也能用作非类型模板形参的实参。

    2.8 、当模板的形参是整型时调用该模板时的实参必须是整型的,且在编译期间是常量,比如template <class T, int a> class A{};如果有int b,这时A<int, b> m;将出错,因为b不是常量,如果const int b,这时A<int, b> m;就是正确的,因为这时b是常量。

    2.9 、非类型形参一般不应用于函数模板中,比如有函数模板template<class T, int a> void h(T b){},若使用h(2)调用会出现无法为非类型形参a推演出参数的错误,对这种模板函数可以用显示模板实参来解决,如用h<int, 3>(2)这样就把非类型形参a设置为整数3。显示模板实参在后面介绍。

    2.10、 非类型模板形参的形参和实参间所允许的转换
      1、允许从数组到指针,从函数到指针的转换。如:template <int *a> class A{}; int b[1]; A<b> m;即数组到指针的转换
      2、const修饰符的转换。如:template<const int *a> class A{}; int b; A<&b> m;   即从int *到const int *的转换。
      3、提升转换。如:template<int a> class A{}; const short b=2; A<b> m; 即从short到int 的提升转换
      4、整值转换。如:template<unsigned int a> class A{};   A<3> m; 即从int 到unsigned int的转换。
      5、常规转换。

非类型形参演示示例1:

  由用户自己亲自指定栈的大小,并实现栈的相关操作。

  TemplateDemo.h

复制代码
 1 #ifndef TEMPLATE_DEMO_HXX
 2 #define TEMPLATE_DEMO_HXX
 3 
 4 template<class T,int MAXSIZE> class Stack{//MAXSIZE由用户创建对象时自行设置
 5     private:
 6         T elems[MAXSIZE];    // 包含元素的数组
 7         int numElems;    // 元素的当前总个数
 8     public:
 9         Stack();    //构造函数
10         void push(T const&);    //压入元素
11         void pop();        //弹出元素
12         T top() const;    //返回栈顶元素
13         bool empty() const{     // 返回栈是否为空
14             return numElems == 0;
15         }
16         bool full() const{    // 返回栈是否已满
17             return numElems == MAXSIZE;
18         }
19 };
20 
21 template <class T,int MAXSIZE> 
22 Stack<T,MAXSIZE>::Stack():numElems(0){     // 初始时栈不含元素
23     // 不做任何事情
24 }
25 
26 template <class T,int MAXSIZE>
27 void Stack<T, MAXSIZE>::push(T const& elem){
28     if(numElems == MAXSIZE){
29         throw std::out_of_range("Stack<>::push(): stack is full");
30     }
31     elems[numElems] = elem;   // 附加元素
32     ++numElems;               // 增加元素的个数
33 }
34 
35 template<class T,int MAXSIZE>
36 void Stack<T,MAXSIZE>::pop(){
37     if (numElems <= 0) {
38         throw std::out_of_range("Stack<>::pop(): empty stack");
39     }
40     --numElems;               // 减少元素的个数
41 }
42 
43 template <class T,int MAXSIZE>
44 T Stack<T,MAXSIZE>::
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇初级线段树小结 下一篇输入输出的优化问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目