先給結論:不要對模版基類作任何假設this
前提:
有以下一個模版類code
template <typename T> class TBase{ public: void f(){ cout << __FUNCTION__ << endl;} };
1.咱們都知道 TBase<int> , TBase<char> ... 等等實例化的類 互相都沒有關係;
2.特化本質上就是接管了編譯器的工做 ; 好比 template<> class TBase<int>{...} 至關於
接管了編譯器去生成TBase<int>;繼承
好了.有了以上的前提. 下面進入正題:模版基類引出的問題接口
下面有這麼一個類:編譯器
template <typename T> class TChild : public TBase<T>{ //繼承一個模版類 public: void doit(){ f(); //有些編譯器能經過,有些則不能 ; 能夠 this->f() .跳過編譯器當前的檢查 } };
通常嚴格的編譯器都將編譯失敗. 緣由 : 編譯器作了一個假設 TBase 有可能被特化, 被特化的版本中可能並未提供 f 接口;it
好比:
對Tbase<int> 特化編譯
template <> //一個空的TBase<int>類 class TBase<int>{ }; int main(int argc, char *argv[]) { TChild<int> t1; t1.doit(); //不嚴格的編譯器獲得這裏纔出錯; return 0; }