模板杂记(一)
模板類中的友元的類外實現時,使用類的內部類聲明變量時的格式:
1 template <typename T> 2 class A 3 { 4 public: 5 private: 6 class B//聲明一個內部類 7 { 8 public: 9 B(void):c(10){} 10 T c; 11 friend ostream& operator<< (ostream& os,const B& b)//內部重載<<,以利于外部使用 12 { 13 return os<<b.c; 14 } 15 }; 16 template <typename T1>//內部的模板聲明,不能用T,會和類外的T重復,報錯 17 friend ostream& operator<< (ostream& os,const A<T1>& a);//友元函數聲明中的A<T1>& 中的T1不能換做T,這好像就是一個友元函數的模板,與class A模板類無關 18 }; 19 template <typename T>//外部實現時必須為模板 20 ostream& operator<< (ostream& os,const A<T>& a) 21 { 22 typename A<T>::B b;//訪問內部類時必須使用typename,告訴編譯器A<T>是一個模板類 23 return os<<b; 24 // typename T::B b; 25 }?
?
下面的代碼中Y可以是一個模板類:
1 template<typename X, typename Z, 2 template<typename T> class Y> 3 class B { 4 public: 5 B (const X& i, const Z& s) : 6 m_i (i), m_s (s) {} 7 Y<X> m_i;//一個模板類聲明的對象作為另一個模板類的成員變量 8 Y<Z> m_s; 9 }; 10 11?
模板類的繼承示意:
1 class A { 2 public: 3 A (const T& t) : m_t (t) {} 4 T m_t; 5 }; 6 template<typename T, typename Y> 7 class B : public A<T> {//注意繼承時基類的格式 8 public: 9 B (const T& t, const Y& y) : 10 A<T> (t), m_y (y) {}//與普通的繼承相同,構造時應該初始化基類 11 Y m_y; 12 };?
?
下面代碼中的子類模板,可以滯后于父類的構造:
?
1 template<typename BASE> 2 class Shape : public BASE {//繼承于一個不確定的基類 3 public: //只有在子類實例化后才能確定基類,才會有這樣的特例 4 void draw (void) const { 5 BASE::draw (); 6 } 7 }; 8 class Rect { 9 public: 10 void draw (void) const { 11 cout << "繪制矩形..." << endl; 12 } 13 }; 14 class Circle { 15 public: 16 void draw (void) const { 17 cout << "繪制圓形..." << endl; 18 } 19 };?
所有代碼的測試環境為ubuntu12.04下的g++編譯器
轉載于:https://www.cnblogs.com/huohongbin/p/3700263.html
總結
- 上一篇: MVC+JSON 无限滚动翻页
- 下一篇: JAVA程序测试时用到的与内存测试有关的