先给结论: 不要对模版基类做任何假设
前提: 有如下一个模版类
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;
}