原文: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);}