模版基類引出的問題

先給結論:不要對模版基類做任何假設

前提:
有如下一個模版類

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 接口;

比如:
對Tbase<int> 特化

template <>            //一個空的TBase<int>類
class TBase<int>{
};

int main(int argc, char *argv[])
{
    TChild<int> t1;
    t1.doit();    //不嚴格的編譯器得到這裏纔出錯;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章