テンプレートのインスタンス化には 2 つのフェーズがあります (「2 フェーズの名前検索」)。
最初のフェーズでは、すべての非依存名が解決 (ルックアップ) されます。2 番目のフェーズでは、従属名が解決されます。
従属名は、テンプレート パラメータに依存する名前です。たとえば、次のようになります。
template <typename T>
void foo() {
x = 0; // <- Non-dependent, nothing in that refers to "T".
// Thus looked up in phase 1, therefore, an 'x' must be
// visible.
T::x = 0; // <- Dependent, because it depends on "T".
// Looked up in phase 2, which is when it must be visible.
}
ここで、次のように記述します。
t = this->a; //Okay
t = a //Error
これはまさに私が説明したことです。テンプレートパラメータに依存するt
ため、フェーズ 2 でルックアップされます。this
エラーのある用語はフェーズ 1 で検索されます。これは、その名前にはテンプレート パラメーターに依存するものがないためです。ただし、フェーズ 1 では、noa
が表示されます。これは、コンパイラがフェーズ 1 で基本クラス テンプレートをイントロスペクトできないためです。テンプレートは特殊化でき、インスタンス化の時点で、プライマリ テンプレート宣言から離れているa
可能性があるためです。目に見える。
例:
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main ()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
ところで、私はかつてこれを書いたことがあります- >私の非常に頻度の低いブログのスタイルの問題だけではありません.