C++ でまだ言及されていない用途が 1 つあります。それは、独自のオブジェクトを参照したり、受け取った変数からメンバーを明確にしたりすることではありません。
を使用this
して、他のテンプレートから継承するテンプレート クラス内で、非依存名を引数依存名に変換できます。
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
テンプレートは、2 パス メカニズムでコンパイルされます。最初のパスでは、引数に依存しない名前のみが解決およびチェックされますが、依存する名前は、テンプレート引数を実際に置換することなく、一貫性についてのみチェックされます。
そのステップでは、実際に型を置換することなく、コンパイラは何base<T>
ができるかについての情報をほとんど持っていないため (ベース テンプレートの特殊化により、未定義の型であっても完全に異なる型に変わる可能性があることに注意してください)、型であると想定するだけです。 . f
この段階では、プログラマーにとって当然のことと思われる非依存呼び出しは、コンパイラーが名前空間のメンバーとして、derived
またはそれを囲む名前空間内で見つけなければならないシンボルであり、これは例では発生しませんが、文句を言うでしょう。
解決策は、非依存名f
を依存名に変えることです。これは、実装されているタイプを明示的に指定することにより、いくつかの方法で実行できます ( -- をbase<T>::f
追加するbase<T>
と、シンボルが依存するようにT
なり、コンパイラはシンボルが存在すると想定し、2 番目のパスの実際のチェックを延期します。引数の置換。
2 つ目の方法は、複数の引数または長い名前を持つテンプレートから継承する場合はthis->
、シンボルの前に a を追加するだけです。実装しているテンプレート クラスは引数に依存する (から継承するbase<T>
)ため、引数にthis->
依存し、同じ結果が得られthis->f
ます。テンプレート パラメーターの置換後、2 番目のラウンドでチェックされます。