类模板

一、类模板的特点:

  1. 类模板实例化的时候要加类型参数,而函数模板实例化的时候不用,因为函数模板能自推出类型
  2. 类成员方法的模板的特例化不允许在类外使用
    #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;
    }
    

    成员方法的特例化模板是不允许在类外使用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值