模板的定义:
多参数,带缺省值得:
template <class TYPE,class ARG=vector<TYPE> >
如果只传给它一个参数,缺省参数可以作为第二参数使用.
关键字typename
typename 被作为型别之前的标识符号。
--------------main----------------------
template <class TYPE>
template <typename T, int SIZE> //typename可以替代class声明模板
多参数,带缺省值得:
template <class TYPE,class ARG=vector<TYPE> >
如果只传给它一个参数,缺省参数可以作为第二参数使用.
关键字typename
typename 被作为型别之前的标识符号。
eg:
#include <iostream>
#include "MyClass.h"
using namespace std;
class Q{
public:
typedef int SubType;
};
int main()
{
cout << "Hello world!" << endl;
MyClass<Q> x;
return 0;
}
-----------MyClass.h------------
template<class T>
class MyClass
{
public:
MyClass();
~MyClass();
MyClass(const MyClass& other);
void printf();
protected:
private:
typename T::SubType * ptr;
};
说明:Subtype成为一个型别的必要条件是:
任何一个用来取代T的型别,其内部必须提供SubType的定义.
模板类的拷贝构造(缺省)和模板构造:
#ifndef MYCLASS_H
#define MYCLASS_H
template<class T>
class MyClass
{
public:
MyClass();
~MyClass();
//MyClass(const MyClass& other);
template<class X>
MyClass(const MyClass<X>& other)
{
//copy ctor
ptr=other.getvalue();
}
T getvalue() const
{
return ptr;
}
// MyClass(const MyClass& other)
// {
// //copy ctor
// ptr=other;
// }
void printf();
protected:
private:
T ptr;
};
--------------main----------------------
int main()
{
cout << "Hello world!" << endl;
MyClass<int> x;
MyClass<double> y(x);
return 0;
}
如果不用 Myclass<X>,则main函数里面是报错的。即使有隐含的double到int类型的强制转化。
而加了Myclass<X>则轻松解决了这一问题。值得注意的是,这里没有用:ptr=other.ptr的原因:
ptr是类的私有成员变量,这里是在 MyClass<T>里面,只能调用T的ptr,X的ptr在T内是不可见的。所以这里用到了getvalue函数。
显示初始化:
int i1;
int i2=int();
template <class T>
void f()
{
T x=T();
}
//调用的是缺省的构造函数.