Demo02.cpp
4 G:\C++\CDaima\TemplateDemo02\TemplateDemo02.cpp(11) :
warning C4244: 'argument' : conversion from 'const double' to 'const int', possible loss of data
5 G:\C++\CDaima\TemplateDemo02\TemplateDemo02.cpp(11) :
warning C4244: 'argument' : conversion from 'const double' to 'const int', possible loss of data
6
7 TemplateDemo02.obj - 0 error(s), 2 warning(s)
四、类模板的默认模板类型形参
1、可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值。
2、类模板的类型形参默认值形式为:template<class T1, class T2=int> class A{};为第二个模板类型形参T2提供int型的默认值。
3、类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所有模板形参都要设定默认值,比如template<class T1=int, class T2>class A{};就是错误的,因为T1给出了默认值,而T2没有设定。
4、在类模板的外部定义类中的成员时template 后的形参表应省略默认的形参类型。比如template<class T1, class T2=int> class A{public: void h();}; 定义方法为template<class T1,class T2> void A<T1,T2>::h(){}。
定义类模板类型形参:
演示实例1:
TemplateDemo.h
1 #ifndef TEMPLATE_DEMO_HXX
2 #define TEMPLATE_DEMO_HXX
3
4 template<class T> class A{
5 public:
6 T g(T a,T b);
7 A();
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)<<endl;
13 }
运行结果: 5
类模板的默认模板类型形参示例1:
TemplateDemo03.h
1 #ifndef TEMPLATE_DEMO_03
2 #define TEMPLATE_DEMO_03
3 //定义带默认类型形参的类模板。这里把T2默认设置为int型。
4 template<class T1,class T2=int> class CeilDemo{
5 public:
6 int ceil(T1,T2);
7 };
8 //在类模板的外部定义类中的成员时template 后的形参表应省略默认的形参类型。
9 template<class T1,class T2>
10 int CeilDemo<T1,T2>::ceil(T1 a,T2 b){
11 return a>>b;
12 }
13
14 #endif
TemplateDemo03.cpp
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3
4 void main(){
5 CeilDemo<int> cd;
6 cout<<cd.ceil(8,2)<<endl;
7 }
运行结果: 2
在类模板的外部定义类中的成员时template 后的形参表应省略默认的形参类型,如果没有省略,不会出现编译错误而是提出警告:
1 --------------------Configuration: TemplateDemo03 - Win32 Debug--------------------
2 Compiling...
3 TemplateDemo03.cpp
4 g:\c++\cdaima\templatedemo03\templatedemo03.h(12) :
5 warning C4519: default template arguments are only allowed on a class template; ignored
6
7 TemplateDemo03.obj - 0 error(s), 1 warning(s)
原作者:类模板类型形参默认值和函数的默认参数一样,如果有多个类型形参则从第一个形参设定了默认值之后的所有模板形参都要设定默认值,比如template<class T1=int, class T2>class A{};就是错误的,因为T1给出了默认值,而T2没有设定。
实例测试如下:
类模板的默认模板类型形参示例2:
TemplateDemo03.h
1 #ifndef TEMPLATE_DEMO_03
2 #define TEMPLATE_DEMO_03
3
4 template<class T1=int,class T2,class T3> class CeilDemo{
5 public:
6 int ceil(T1,T2,T3);
7 };
8
9 template<class T1,class T2,class T3>
10 int CeilDemo<T1,T2,T3>::ceil(T1 a,T2 b,T3 c){
11 return a+b+c;
12 }
13
14 #endif
TemplateDemo03.cpp
1 #include<iostream.h>
2 #include "TemplateDemo03.h"
3
4 void main(){
5 CeilDemo<int,int> cd;
6 cout<<cd.ceil(2,3,4)<<endl;
7 }
运行结果: 9
上例中我们看到,虽然多个类型形参则从第一个形参T1设定了默认值为int类型,但后面的两个并没有设定默认值。我们在声明对象的时候指明了T2和T3的类型都为int类型,编译、运行没有任何警告和错误