次のコードは、エラーなしでコンパイルできます。
template <typename T> struct A {
void f() { this->whatever; } // whatever is not declared before
};
int main() {
A<int> a;
}
そして、それthis
は型に依存する式であるためwhatever
、実際のテンプレート引数が判明するまで名前の検索が延期されるためであることはわかっています。この場合、メンバー関数f()
は使用されないため、 のインスタンス化はA<T>::f
存在せず、 の名前検索whatever
は実行されません。
this
クラステンプレートに次のようなタイプ依存のベースがある場合、それはタイプ依存であることを理解できます。
template <typename T> struct B { T whatever; };
template <typename T> struct A : B<T> {
void f() { this->whatever; }
};
int main() {
A<int> a;
}
テンプレート クラス の定義を解析するとき、そのベースの型を知るA
ことは不可能です。それどころか、メンバー関数がどこかで使用されるとすぐに、最初の例で合法になる可能性は見当たりません。this->whatever
B<T>
whatever
this->whatever
f
this->whatever
では、最初の例のいくつかの点で合法である可能性はありますか? this
そうでない場合、その場合に型依存の式として扱われるべき他の理由はありますか?