注意:函数模板不支持模板的模板参数。
Stack7.h中定义的Stack:
#ifndef STACK7_H #define STACK7_H #include <deque> #include <stdexcept> #include <memory> template <typename T, template <typename ELEM, typename = std::allocator<ELEM> > class CONT = std::deque> class Stack { public: void push(T const&); void pop(); T top() const; bool empty() const { return elems.empty(); } template<typename T2, template<typename ELEM2, typename = std::allocator<ELEM2> > class CONT2> Stack<T, CONT>& operator = (Stack<T2, CONT2> const&); private: CONT<T> elems; }; template <typename T, template <typename, typename> class CONT> void Stack<T, CONT>::push(T const& elem) { elems.push_back(elem); } template <typename T, template <typename, typename> class CONT> void Stack<T, CONT>::pop() { if (elems.empty()) throw std::out_of_range("Stack<>::pop(): empty stack"); elems.pop_back(); } template <typename T, template <typename, typename> class CONT> T Stack<T, CONT>::top() const { if (elems.empty()) throw std::out_of_range("Stack<>::top(): empty stack"); return elems.back(); } template <typename T, template <typename, typename> class CONT> template <typename T2, template <typename, typename> class CONT2> Stack<T, CONT>& Stack<T, CONT>::operator = (Stack<T2, CONT2> const& op2) { if ((void*)this == (void*)&op2) return *this; Stack<T2, CONT2> tmp(op2); elems.clear(); while (!tmp.empty()) { elems.push_front(tmp.top()); tmp.pop(); } return *this; } #endif // STACK7_H
测试代码main.cpp:
#include <iostream> #include <string> #include <cstdlib> #include <vector> #include "Stack7.h" using namespace std; int main() { try { Stack<int, std::vector> vecStack; vecStack.push(2); vecStack.push(3); std::cout << "vector Stack's top: " << vecStack.top() << std::endl; vecStack.pop(); Stack<int> intStack; Stack<float> floatStack; intStack.push(6); intStack.push(7); floatStack.push(9.9); floatStack = intStack; std::cout << floatStack.top() << std::endl; floatStack.pop(); std::cout << "float Stack's top:" << floatStack.top() << std::endl; floatStack.pop(); std::cout << "float Stack's top:" << floatStack.top() << std::endl; floatStack.pop(); } catch (std::exception const& ex) { std::cerr << "Exception: " << ex.what() <<std::endl; } return 0; }
结果: