模板类型的模板参数

先看一个非常简单的例子: 

template
class A
{
private:
T a;
public:
A(T  a);
~A();
void print();
};

template
A::A(T  t) : a(t)
{}

template
A::~A( )
{}

template
void A::print()
{
cout << a << endl;
}

调用:

A   a(111);
a.print();

这里的T是基本数据类型 int ,那么如果 T是模板类类型,怎么办???

进一步扩展,把int换成template   class  即可


template <     template class     T     >
class B
{
private:
T   t;
public:
B( T   b);
~B();
void print();
};


template < template class     T>
B::B(T  b) : t( b )

}


template < template class     T>
B::~B()

}


template < template class     T>
void B::print()
{
t.print();
}


调用:

A   a(111);
a.print();
 

        //这里的T是模板类 类型
B  b(a);
b.print();




依据上面的道理,看下面的扩展的Stack例子:

文件 "Stack.h"


#pragma once
#include
#include
 


template

            template     >class     T2  >

class Stack {
private:
T2
elems; // 元素
public: 
Stack();
~Stack();
void push(T1 const&); // push 元素
void pop(); // pop 元素
T1 top() const; // 传回最顶端元素
bool empty() const;
};
 

template  >class  T2  >
Stack::Stack()
{
cout << "Construct"< }
template  >class  T2  >
Stack::~Stack()
{
cout << "Deconstruct"< }
 
template  >class  T2  >
void Stack::push(T1 const& elem)
{
elems.push_back(elem); // 追加(附于尾)
}


template  >class  T2  >
void Stack::pop()
{
if (elems.empty()) {
throw std::out_of_range("Stack<>::pop: empty stack");
}
elems.pop_back(); // 移除最后一个元素
}




template  >class  T2  >
T1  Stack::top() const
{
if (elems.empty()) {
throw std::out_of_range("Stack<>::top: empty stack");
}
return elems.back(); // 传回最后一个元素的拷贝
}


template  >class  T2  >
bool Stack::empty() const { // stack是否为空
return elems.empty();
}




调用:

#include "stdafx.h"
#include
#include
#include
#include
#include "Stack.h"


using  namespace  std;


 
int main()
{
 
     Stack   s;
     s.push( 1.2);
     s.push(2.2);
     s.push(5.5);
     cout << s.top()<

    Stack   q;
    q.push(11);
    q.push(22);
    q.push(33);

    cout << q.top() << endl;


 
    return 0;
}


你可能感兴趣的:(template)