template <class T1, class T2>
class A
{
T1 i;
T2 j;
public:
A(T1 a, T2 b) {i=a;j=b;}
void show() {cout<<i<<' '<<j<<endl;}
};
int main()
{
A <int,double> ob1(10,0.23);
A <char,char*> ob2('q',"qwert");
ob1.show();
ob2.show();
return 0;
}
.
, .
#include <iostream>
using namespace std;
#include <string.h>
template <class T1,class T2>
T1 sm(T1 a,T2 b) //
{ return (T1)(a+b); // c
}
template <class T1,class T2,class T3>
T1 sm(T1 a,T2 b,T3 c) //
{ return (T1)(a+b+c); // c
}
int main()
{cout<<" sm(int,int) = "<<sm(4,6)<<endl;
cout<<" sm(int,int,int) = "<<sm(4,6,1)<<endl;
cout<<" sm(int,double) = "<<sm(5,3)<<endl;
cout<<" sm(double,int,short)= " <<
sm(.4,6,(short)1)<<endl;
// cout<<sm(" "," ++")<<endl; error cannot add two pointers
return 0;
}
.
, :
#include <iostream>
using namespace std;
template <class T1,int i=0,class T2>
class cls
{ T1 a;
T2 b;
public:
cls(T1 A,T2 B): a(A),b(B){}
~cls(){}
T1 sm() //
{ // i+=3; // error member function 'int __thiscall cls<int,2>::sm(void)'
return (T1)(a+b+i); //a=b+i; return a;
}
};
int main()
{ cls <int,1,int> obj1(3,2); // const i 1
cls <int,0,int> obj2(3,2,1); // error 'cls<int,0>::cls<int,0>':no overloaded
// function takes 3 parameter s
cls <int,int,int> obj13(3,2,1); // error 'cls': invalid template argument for 'i',
// constant expression expected
cls <int,int> obj2(3,1); // error ( )
cout<<obj1.sm()<<endl;
return 0;
}
6.
template <class T1,int i=0,class T2> -
, cls , −
(1 2), (int i=0) − . -
i cls <int,1,int> obj1(3,2).
i template
template <class T1,int i,class T2>
.
, , .
|
|
. :
- ;
- ;
- .
, oper vect.
#include <iostream>
using namespace std;
template <class T>
class vect // -
{protected:
T *ms; // -
int size; // -
public:
vect(int n): size(n) //
{ ms=new T[size];}
~vect(){delete [] ms;} //
T &operator[](const int ind) // []
{ if((ind>0) && (ind<size)) return ms[ind];
else return ms[0];
}
};
template <class T>
class oper: public vect<T> //
{ public:
oper(int n): vect<T>(n) {} //
~oper(){} //
void print() //
{ for(int i=0;i<size;i++)
cout<<ms[i]<<' ';
cout<<endl;
}
};
int main()
{ oper <int> v_i(4); // int-
oper <double> v_d(4); // double-
v_i[0]=5; v_i[1]=3; v_i[2]=2; v_i[3]=4; // int
v_d[0]=1.3; v_d[1]=5.1; v_d[2]=.5; v_d[3]=3.5; // double
cout<<"int = ";
v_i.print();
cout<<"double = ";
v_d.print();
return 0;
}
, - .
friend.
, , . , - ( ) ( ).
( , )
template <class T>
class B;
template <class T>
class A
{
T *m;
int size;
public:
A(int size, T *m);
~A();
friend T fun1 (T&);
friend T B<T>::fun2(A<T> &);
};
template <class T>
class B
{
public:
T fun2(A<T> &);
};
template <class T>
void fun1(T &obj)
{
}
int main()
{
int m1[]={1,2,3};
A <int> a1(3,m1);
fun1(a1);
return 0;
}