テンプレートベースクラスからの問題

952 ワード

まず結論を出します:テンプレートのベースクラスに対していかなる仮定をしないでください
前提:次のテンプレートクラスがあります.
template 
class TBase{
 public:
    void f(){ cout << __FUNCTION__ << endl;}
};

1.私たちはTBAse、TBAseを知っています.などのインスタンス化されたクラスは互いに関係ありません.2.特化は本質的にコンパイラを引き継いだ仕事である.例えばtemplate<>class TBASE{...}コンパイラを引き継いでTBAseを生成することに相当します.
よし以上の前提がある次は本題に入ります:テンプレートベースクラスが引き出す問題
次のクラスがあります.
template 
class TChild : public TBase{  //       
  public:
    void doit(){
        f(); //        ,      ;     this->f() .          
    }
};

一般的に厳格なコンパイラはコンパイルに失敗する.理由:コンパイラはTBAseが特化される可能性があると仮定し、特化されたバージョンではfインタフェースが提供されていない可能性がある.
例えばTbase特化
template <>            //    TBase 
class TBase{
};

int main(int argc, char *argv[])
{
    TChild t1;
    t1.doit();    //              ;
    return 0;
}