一、类模板的特点:
- 类模板实例化的时候要加类型参数,而函数模板实例化的时候不用,因为函数模板能自推出类型
- 类成员方法的模板的特例化不允许在类外使用
#include<iostream> #include<string> #define MAXSIZE 10 using namespace std; template<typename T> class Carry { public:Carry() { _size = MAXSIZE; _arr = new T[_size]; _count = 0; } Carry(const Carry& src) { _arr = new T[src._size]; for(int i=0; i<src._count; i++) { _arr[i] = src._arr[i]; } _count = src._count; _size = src._size; } Carry &operator=(const Carry& src) { if(this == src) { return *this; } delete []_arr; _arr = new T[src._size]; for(int i=0; i<src._count; i++) { _arr[i] = src._arr[i]; } _size = src._size; _count = src._count; } ~Carry() { delete []_arr; _count = 0; _size = 0; } template<typename U> //类内使用成员方法的模板 int find(U val) { cout<<"find(U val)"<<typeid(U).name()<<endl; for(int i=0; i<_count; i++) { if(_arr[i] == val) { return i; } } return -1; } template<> int find<char *>(char* val) { cout<<"find<char *>(char* val)"<<endl; for(int i=0; i<_count; i++) { if(strcmp(_arr[i],val) == 0) { return i; } } return -1; } private: int _size; //数组的大小 int _count; //数组实际存储数据的个数 T *_arr; }; int main() { Carry<char *>s2; s2.PushBack("hello wprld"); s2.PushBack("aaa"); char str[] = {'a','a','a','\0'}; int pos1 = s2.find(str); cout<<"str "<<pos1<<endl; }
在类外使用
template<typename T> void Carry<T>::Show() { for (int i = 0; i < _count; i++) { cout<<_arr[i]<<" "; } cout<<endl; } template<typename T> template<typename U> int Carry<T>::find(U val) //Carry<T>是作用域 { cout<<"Carry<T>::find(U val)"<<endl; for(int i=0; i<_count;i++) { if(_arr[i] == val) { return i; } } return -1; }
成员方法的特例化模板是不允许在类外使用的