c++模板类

原文:https://zhidao.baidu.com/question/1896673576873482820.html

template  class  _T >
class  CString
{
public :
     CString( );
     virtual  ~ CString( );
 
protected :
     _T * string;
     size_t  capacity;
     size_t  len;
};

上面代码创建了一个字符串模板类,用的时候像下面这样子 :

1
2
CString<  char  > ascii_string;
CString<  wchar_t  > wild_string;

 模板的作用在于创建一个类型无关,但是逻辑上一致的数据类型,比方说字符串,现在字符串有两种,一种是符合 ASCII 标准的单字节字符串,一种则是符合 UNICODE 标准的多字节字符串,但是两种字符串的抽象接口都一样,都可以求字符串长度,都可以获取字符串指针,都可以进行下标索引,都可以用于字符串连接,但是特意创建两个类来分别表示两种字符串,未免有点浪费,所以类模板就出现了,我们只需要创建一个类模板,就可以表示两种类型的字符串;

template<class T1,class T2,class T3>
  T1 sum(T1 a,T2 b,T3 c){
      return a+b+c;
  }
int main(int argc, char *argv[])
{
    cout<<sum<double,short,int>(1.1,3,257)<<endl;

}

这个可以,下面的test也可以,但是MyData不知道为什么报错:

#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<stdlib.h>
using namespace std;
 
template <class T1=int , class T2=float>
class MyData{
    public :
        MyData();
        MyData(T1 a , T2 b );
        MyData(T1 a , T1 b ,T1 c) ;
        ~MyData();
    private :
};
 
template <class T1=int,class T2=float>
class Test
{
public:
    Test();
    Test(T1 d1, T2 d2);
    template <class U,class V> Test(const Test<U,V> &t);
    void SetData1(T1 val)
    {
        data1=val;
    }
    void SetData2(T2 val)
    {
        data2=val;
    }
    T1 GetData1()
    {
        return data1;
    }
    T2 GetData2()
    {
        return data2;
    }
private:
    T1 data1;
    T2 data2;
};
 
 
template <class T1,class T2>
Test<T1,T2>::Test() {}
 
 
template <class T1,class T2>
Test<T1, T2>::Test(T1 d1, T2 d2):
    data1(d1),data2(d2) {}
 
 
template <class T1,class T2> template <class U,class V>
Test<T1, T2>::Test(const Test<U,V> &t):
    data1(t.data1),data2(t.data2) {};
 
 
int main(int argc, char *argv[])
{
//    MyData<int,float> obj2(4, -2);
    Test <int,double> t1(10, 5.4);
    cout<<t1.GetData1()<<"   "<<t1.GetData2()<<endl;
    Test <int,double> t2(t1);
    cout<<t2.GetData1()<<"   "<<t2.GetData2()<<endl;

最后找到原因了:正确的写法如下:

#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<stdlib.h>
using namespace std;
 
template <class T1=int , class T2=float>
class MyData{
    public :
        MyData();
        MyData(T1 a, T2 b);
        MyData(T1 a , T1 b ,T1 c) ;
//        ~MyData();
    private :
        T1 data1;
        T2 data2;
};
template <class T1,class T2>
MyData<T1, T2>::MyData(T1 d1, T2 d2):
    data1(d1),data2(d2) {}

int main(int argc, char *argv[])
{
    MyData<int,double> obj2(4, -2.1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值