1. 类模板的声明
1.1 在类模板外实现成员函数
#include <iostream>
using namespace std;
template < class T >
class CMath {
public :
CMath ( T const & t1, T const & t2) : m_t1 ( t1) , m_t2 ( t2) { }
T add ( void ) ;
private :
T m_t1;
T m_t2;
} ;
template < class T > T CMath< T> :: add ( ) {
return m_t1 + m_t2;
}
int main ( void ) {
return 0 ;
}
2. 类模板的使用
第三点,比如在下面的例子中,int类型可以支持成员add函数的+运算符符,如果把int换成别的不支持+运算符的类型(比如指针类型),也是可以实例化类模板的,只要不去把这个类的add函数就行。 所有有一种情况,想用某个类模板的某个成员函数的功能,然后用某个类型去示例化类模板,只用考虑这个类型是否满足那个成员函数的里面的语法就行。
#include <iostream>
using namespace std;
template < class T >
class CMath {
public :
CMath ( T const & t1, T const & t2) : m_t1 ( t1) , m_t2 ( t2) { }
T add ( void ) {
return m_t1 + m_t2;
}
private :
T m_t1;
T m_t2;
} ;
int main ( void ) {
CMath< int > m1 ( 1 , 1 ) ;
std:: cout << m1. add ( ) << std:: endl;
return 0 ;
}
3. 类模板的静态成员
#include <iostream>
using namespace std;
template < class T >
class A {
public :
static void print ( ) {
cout << "&m_i: " << & m_i << ". &m_t:" << & m_t << endl;
}
static int m_i;
static T m_t;
} ;
template < class T > int A< T> :: m_i;
template < class T > T A< T> :: m_t;
int main ( void ) {
A< int > x, y, z;
x. print ( ) ;
y. print ( ) ;
z. print ( ) ;
A< int > :: print ( ) ;
return 0 ;
}
4. 类模板的递归实例化
对于二维数组,如果把它看成一维数组,那么它的每一个元素又是一个数组
#include <iostream>
using namespace std;
template < class T >
class Array {
public :
T& operator [ ] ( size_t i) {
return m_arr[ i] ;
}
private :
T m_arr[ 10 ] ;
} ;
int main ( void ) {
Array< Array< int > > m;
for ( int i= 0 ; i< 10 ; i++ ) {
for ( int j= 0 ; j< 10 ; j++ ) {
m[ i] [ j] = 1 ;
}
}
for ( int i= 0 ; i< 10 ; i++ ) {
for ( int j= 0 ; j< 10 ; j++ ) {
cout << m[ i] [ j] << " " ;
}
cout << endl;
}
return 0 ;
}
$ ./a.out
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1