テンプレートベースクラスからの問題
まず結論を出します:テンプレートのベースクラスに対していかなる仮定をしないでください
前提:次のテンプレートクラスがあります.
1.私たちはTBAse、TBAseを知っています.などのインスタンス化されたクラスは互いに関係ありません.2.特化は本質的にコンパイラを引き継いだ仕事である.例えばtemplate<>class TBASE{...}コンパイラを引き継いでTBAseを生成することに相当します.
よし以上の前提がある次は本題に入ります:テンプレートベースクラスが引き出す問題
次のクラスがあります.
一般的に厳格なコンパイラはコンパイルに失敗する.理由:コンパイラはTBAseが特化される可能性があると仮定し、特化されたバージョンではfインタフェースが提供されていない可能性がある.
例えばTbase特化
前提:次のテンプレートクラスがあります.
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;
}