模板的定义:
多参数,带缺省值得:
template <class TYPE,class ARG=vector<TYPE> >
如果只传给它一个参数,缺省参数可以作为第二参数使用.
关键字typename
typename 被作为型别之前的标识符号。
--------------main----------------------
如果不用 Myclass<X>,则main函数里面是报错的。即使有隐含的double到int类型的强制转化。
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>则轻松解决了这一问题。值得注意的是,这里没有用: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();
}
//调用的是缺省的构造函数.