模版基类引出的问题

先给结论:不要对模版基类作任何假设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;
}
相关文章
相关标签/搜索