类模板
类模板一定是显示调用!!!
从类模板实例化的每个模板类都有自己的类模板成员函数,该类模板的所有对象共享一个static数据成员。
和非类模板的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化。
每个模板类有自己的类模板的static数据成员副本。
#include<iostream>
using namespace std;
template<typename T> //先声明类
class Complex;
template<typename T>
ostream &operator <<(ostream &out,const Complex <T> &c); //声明函数原型
template<typename T> //类模板
class Complex
{
//template<typename T>
friend ostream &operator << (ostream &out,const Complex <T> &c);
private:
T m_a;
T m_b;
public:
Complex(T a,T b);
void print();
};
template<typename T>
Complex<T>::Complex(T a,T b)
{
m_a=a;
m_b=b;
}
template<typename T>
void Complex<T>::print()
{
cout<<m_a<<" + "<<m_b<<" i "<<endl;
}
//friend ostream &operator << <T>(ostream &out,const Complex&c);
template<typename T>
ostream &operator << (ostream &out,const Complex <T> &c) //重载 <<
{
out<<c.m_a<<" + "<<c.m_b<<" i "<<endl;
return out;
}
int main()
{
Complex <int>c (1,2);
c.print();
return 0;
}
函数模板
#include<iostream>
using namespace std;
template <typename T> //函数模板
T add(T x,T y)
{
return x+y;
}
template<typename T1,typename T2>
void print(T1 x,T2 y) // 当函数模板遇到普通函数,优先调用普通函数
{
cout<<"void print(T1 x,T2 y) "<<endl;
cout<<x<<" "<<y<<endl;
}
void print(int x,int y)
{
cout<<"int int "<<endl;
cout<<x<<" "<<y<<endl;
}
int main()
{
int a=1,b=2;
double c=1.50,d=2.00;
cout<<add(a,b)<<endl; //显式声明
cout<<add<double>(c,d)<<endl; //隐式声明
cout<<add<int>(a,c)<<endl; //把double转变成int型
cout<<"********"<<endl;
print(a,b); //调用普通函数
print<int>(a,b); //调用模板
return 0;
}