先給結論:不要對模版基類做任何假設
前提:
有如下一個模版類
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;
}