私はEffective C++第3版、アイテム43「テンプレート化された基本クラスの名前にアクセスする方法を知っています」を読んでいます。上記のコードについてC++のテンプレート化された基本クラスの名前を見つける
template<typename T>
class B {
T i;
};
template<typename T>
class D: public B<T> {
public:
void Foo() {
T a = B<T>::i;
}
};
int main() {
D<int> d;
}
、私はB<T>::
がD::Foo()
でi
前に追加されていない場合、コンパイラは「i
はこのスコープで宣言されていなかった」文句を言うことを知っています。 (ただし、i
はB
で非公開です)
ただし、T i;
がBで宣言されていない場合、次のようにコンパイルは順調に進んでいます。
template<typename T>
class B {
};
template<typename T>
class D: public B<T> {
public:
void Foo() {
T a = B<T>::i;
}
};
int main() {
D<int> d;
}
コンパイラは、デフォルトでテンプレートベースのクラスで名前を見つけられません。 しかし、なぜ彼らはまだ私に言いましたか?