2017-08-19 4 views
1

私は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はこのスコープで宣言されていなかった」文句を言うことを知っています。 (ただし、iBで非公開です)

ただし、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; 
} 

コンパイラは、デフォルトでテンプレートベースのクラスで名前を見つけられません。 しかし、なぜ彼らはまだ私に言いましたか?

答えて

2

しかし、なぜ私はまだ彼らに言いましたか?メンバ関数Fooが使用されていない

ので、それがすべてでinstantiatedではありません。

これは、クラステンプレートのメンバーに適用されます。メンバーがプログラムで使用されていない限り、インスタンス化されておらず、定義を必要としません。

あなたが

D<int> d; 
d.Foo(); 

ところで

のように、errorFoo場合が呼び出されるかもしれません。しかし、それはiBでプライベートで文句を言いませんでした。

名前の参照後にアクセシビリティチェックが行われるためです。 iという名前が見つからない場合は、何もアクセスできないことを確認できます。

関連する問題